在msdnCSS动画页面有这样一句话:
与传统的 JavaScript 驱动的动画实践比较,它可提供更好的呈现性能。
出自:http://msdn.microsoft.com/zh-cn/library/jj680076(v=vs.85).aspx
移动端的开发也有这种hack,来解决可能的卡顿问题:css-webkit-transform: translate3d(0, 0, 0);
出自:http://www.qianduan.net/high-performance-css3-animations.html
看了一些文章,介绍CSS3动画的会说道一些性能问题,但没有具体说清楚,这这两种动画在开发中(包括移动端)如何取舍呢?
根据Google Developer,Chromium项目里,渲染线程分为main thread和compositor thread。
如果CSS动画只是改变
transforms
和opacity
,这时整个CSS动画得以在compositor thread完成(而JS动画则会在main thread执行,然后触发compositor进行下一步操作)在JS执行一些昂贵的任务时,main thread繁忙,CSS动画由于使用了compositor thread可以保持流畅,可参考adobe的博客。
CSS动画比JS流畅的前提:
在CSS动画或JS动画触发了paint或layout时,需要main thread进行Layer树的重计算,这时CSS动画或JS动画都会阻塞后续操作。
参考CSS Triggers,只有如下属性的修改才符合“仅触发Composite,不触发layout或paint”:
所以只有用上了3D加速或修改opacity时,才有机会用得上CSS动画的这一优势。
因此,在大部分应用场景下,效率角度更值得关注的还是下列问题。
那么Chromium以外的其他浏览器呢?CSSTrick里比较了一次效率。
可以看到,Chromium以外的其他浏览器没有这方面的CSS动画效率的优化。尽管MSDN提到“它可提供更好的呈现性能”,但测试并没有支持这一点。
现今CSS动画和JS动画主要的不同点是
@keyframes
不支持递归定义,如果有多种类似的动画过程,需要调节多个参数来生成的话,将会有很大的冗余(比如jQuery Mobile的动画方案),而JS则天然可以以一套函数实现多个不同的动画过程@keyframes
的动画粒度粗,而JS的动画粒度控制可以很细TransitionEnd
、AnimationEnd
,但是它们都需要针对浏览器加前缀),JS则需要自己写事件