JS动画与CSS动画

一、JS动画(setInterval setTimeOut requestAnimationFrame)

优点

  1)过程控制能力强。可以对动画工程进行精准的控制,暂停、取消、开始、终止都可以。

  2)动画效果多、炫酷。有一些效果是CSS动画所不能实现的

  3)兼容性比较高

缺点

   1)由于JS是通过不断的操作DOM和CSS的属性来实现动画效果的,这需要不断的重排(reflow)和重绘(repaint),非常消耗浏览器的内存。(在PC端有浏览

     器可以分配的内存比较大,动画的重排(reflow)和重绘(repaint)可以忽略不计,但是在移动端效果非常明显)

   2)JS动画在主线程中执行,由于主线程中还有其他的JavaScript脚本等需要执行,对主线程进行干扰有可能造成丢帧的问题。

   3)较CSS动画复杂

   4)由于JS动画的异步处理导致动画开始执行的时间不能准确控制

二、CSS动画(transition transform animation)

优点

  1)浏览器可以进行优化

      原因:浏览器使用与requestAnimationFrame 类似的机制,比起比起setTimeout,setInterval设置动画的优点是

          *requestAnimationFrame 会把一帧中的所有DOM操作集中起来,在一次重绘或者回流中就完成。并且刷新频率与浏览器相同

          *在隐藏或不可见的元素中requestAnimationFrame不会进行重绘或者回流,所以会使用更少的CPU GPU和内存使用量

      优化的前提条件

        *在Chromium基础上的浏览器

        *CSS动画不触发layout或者paint(在JS和CSS动画中触发layout和paint,需要在main thread中重新计算Layer树,这时JS CSS动画都会阻塞后续操作)

  修改以下的属性能做到只触发composite,不触发layout和paint      

  • backface-visibility
  • opacity
  • perspective
  • perspective-origin
  • transfrom

  2)部分属性能够启动3D加速和GPU硬件加速(通过GPU来提高动画性能),例如使用transform的translateZ进行3D变换时

  3)代码简单,方便调优。

  4)对于帧速表现不好的低版本浏览器,CSS3可以做到自然降级,而JS则需要撰写额外代码

缺点

  1)对动画工程无法控制,只能在特定场合暂停取消,不能添加回调函数

  2)兼容性不好

三、性能问题

1、CSS 2D矩阵动画效率高于js利用margin和left,top模拟的矩阵动画(CSS3的2D动画是指是2D矩阵Transform变化,比如缩放\变形\x轴\y轴(js当然是不能做变形动画的))

例如,使用CSS3的transform做translateXY动画比js中的position left,position right快了近700mm!而且也更流畅

   

2、CSS3其它常规动画属性的效率均低于js模拟的动画(常规动画属性在这里是指:height,width,opacity,border-width,color…..)

猜你喜欢

转载自www.cnblogs.com/qqinhappyhappy/p/11567327.html