CSS3动画和JS动画的比较

前言

以前有被问到一个问题,css3动画和js动画性能谁更好,为何。据个人经验,固然以为css3动画性能更好,至于为何一时还真答不上来,因此特地查了一下资料总结一波。css

JS动画

优势:

  1. js动画控制能力强,能够在动画博凡过程当中对动画进行精细控制,开始、暂停、终止、取消都是能够作到的
  2. 动画效果比css3动画丰富,好比曲线运动,冲击闪烁,视差滚动效果,只有js动画才能完成
  3. js动画大多数状况下没有兼容性问题,而css3动画有兼容性问题

缺点

  1. js动画的复杂度高于css3
  2. js在动画浏览器的主线程中执行,而主线程还有其余javaScript脚本,样式计算、布局、绘制任务等,对其干扰可能出现阻塞从而出现丢帧的状况
  3. js动画每每须要频繁操做DOM的css属性来实现视觉上的动画效果,这个时候浏览器要不停地执行重绘和重排,这对于性能的消耗是很大的,尤为是在分配给浏览器的内存没那么宽裕的移动端。

CSS3动画

优势:

  1. 部分状况下浏览器能够对动画进行优化,为何说部分状况下呢,由于是有条件的:
    • 在Chromium基础上的浏览器中
    • 同时CSS动画不触发layout或paint,在CSS动画或JS动画触发了paint或layout时,须要main thread进行Layer树的重计算,这时CSS动画或JS动画都会阻塞后续操做。html

      在主线程中,维护了一棵Layer树(LayerTreeHost),管理了TiledLayer,在compositor thread,维护了一样一颗LayerTreeHostImpl,管理了LayerImpl,这两棵树的内容是拷贝关系。所以能够彼此不干扰,当Javascript在main thread操做LayerTreeHost的同时,compositor thread能够用LayerTreeHostImpl作渲染。当Javascript繁忙致使主线程卡住时,合成到屏幕的过程也是流畅的。
      为了实现防假死,鼠标键盘消息会被首先分发到compositor thread,而后再到main thread。这样,当main thread繁忙时,compositor thread仍是可以响应一部分消息,例如,鼠标滚动时,加入main thread繁忙,compositor thread也会处理滚动消息,滚动已经被提交的页面部分(未被提交的部分将被刷白)。java

  2. 部分效果能够强制使用硬件加速 (经过 GPU 来提升动画性能)

缺点

  1. 运行进程控制较弱,css3动画只能在某些场景下控制动画的暂停与继续,不能在特定的位置添加添加回调函数
  2. js在动画浏览器的主线程中执行,而主线程还有其余javaScript脚本,样式计算、布局、绘制任务等,对其干扰可能出现阻塞从而出现丢帧的状况

css动画比js动画流畅的前提

  • js在执行一些复杂的任务
  • css动画比较少或者不触发pain和layout,即重绘和重排,例如经过改变以下属性生成的css动画
    • backface-visibility
    • opacity
    • perspective (设置元素视图)
    • perspective-origin
    • transfrom
  • 部分属性可以启动3D加速和GPU硬件加速,例如使用transform的translateZ进行3D变换时
  • 在Chromium基础上的浏览器中,这个貌似是内核作了优化,当css动画知识改变transfrom和opacity时,整个CSS动画得以在compositor thread完成(而JS动画则会在main thread执行),这样css动画渲染不会影响主线程。

### 总结
回归到平常开发中,当有一个动画的需求时,首要考虑的确定是能不能尽量实现的问题。若是在CSS动画和JS动画都能实现的基础上才会要去根据上面总结的权衡哪一个性能更好的问题。总之,并不必定css动画就比js动画好,还得看具体的需求和业务场景。css3

参考文章

相关文章
相关标签/搜索