JS动画
- js+dom:没有兼容问题;
优点:
js动画控制能力强,可以在动画博凡过程中对动画进行精细控制,开始、暂停、终止、取消都是可以做到的
动画效果比css3动画丰富,比如曲线运动,冲击闪烁,视差滚动效果,只有js动画才能完成
js动画大多数情况下没有兼容性问题,而css3动画有兼容性问题
缺点:
js动画的复杂度高于css3
js在动画浏览器的主线程中执行,而主线程还有其他javaScript脚本,样式计算、布局、绘制任务等,对其干扰可能出现阻塞从而出现丢帧的情况
js动画往往需要频繁操作DOM的css属性来实现视觉上的动画效果,这个时候浏览器要不停地执行重绘和重排,这对于性能的消耗是很大的,尤其是在分配给浏览器的内存没那么宽裕的移动端。
CSS3动画
- css3兼容:IE10+、FF、oprea(animation);safari、chrome(-webkit-animation)
优点:
部分情况下浏览器可以对动画进行优化,为什么说部分情况下呢,因为是有条件的:在Chromium基础上的浏览器中
同时CSS动画不触发layout或paint,在CSS动画或JS动画触发了paint或layout时,需要main thread进行Layer树的重计算,这时CSS动画或JS动画都会阻塞后续操作。部分效果可以强制使用硬件加速 (通过 GPU 来提高动画性能)
缺点:
运行进程控制较弱,css3动画只能在某些场景下控制动画的暂停与继续,不能在特定的位置添加添加回调函数
总结
区别:
- 1.时间尺度上,keyframes动画粒度粗,js的动画粒度可以很精细;
- 2.CSS3里被支持的时间函数不多,不够零活;
- 3.css3动画无法做到支持两个状态以上的转换;
- 4.CSS3更为简单;
- 5.对于帧速表现不好的浏览器,CSS3可以做到自动优雅降级,JS还需要写额外的代码;
- 6.CSS3动画有天然的事件支持(AnimationEnd/TransitionEnd)
- 7.CSS3有兼容性问题。
性能上:
js在动画浏览器的主线程中执行,而主线程还有其他javaScript脚本,样式计算、布局、绘制任务等,对其干扰可能出现阻塞从而出现丢帧的情况
css动画比js动画流畅的前提
- 1.chrome基础的浏览器;
- 2.js执行一些昂贵的任务;
- 3.css动画不触发layout和paint;(css3和js触发layout和paint时都会阻塞后续操作)
以下属性的修改不会触发layout和paint:
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动画都能实现的基础上才会要去根据上面总结的权衡哪个性能更好的问题。
注:在最新的浏览器进行运行测试时会发现,其实两者的加载速度差别很小,所以具体的选择需要看具体的需求和业务来进行选择