CSS3动画性能优化

CSS3的动画简单好用,但是性能方面存在一些问题,很多时候一不留神CPU就满了

记住下面的一些常用技巧,去优化我们的CSS3动画:

(1) translate3d 进行 gpu 加速

写动画时候写这个,保证性能加速10%以上

-webkit-transform: translate3d(0, 0, 0);
-moz-transform: translate3d(0, 0, 0);
-ms-transform: translate3d(0, 0, 0);
transform: translate3d(0, 0, 0);

一个元素通过translate3d右移500px的动画流畅度会明显优于使用left属性

原因是因为:

  • CSS动画属性会触发整个页面的重排,重绘。
  • Paint通常是其中最花费性能的,尽可能避免使用触发paint的CSS动画属性,这也是为什么我们推荐在CSS动画中使用webkit-transform: translateX(3em)的方案代替使用left: 3em,因为left会额外触发layout与paint,而webkit-transform只触发整个页面composite(这也是为什么推荐在CSS动画中使用webkit-transform: translateX(500px)的方案代替使用left: 500px);

(2) box-shadow和gradients

这两个东西在css3里往往都是页面的性能杀手,计算他们尤其消耗cpu, 尤其是在一个元素同时都使用了它们,所以拥抱扁平化设计吧;

(3) 性能消耗图

性能消耗图,由此可见最受欢饮和性能最好的莫过于transform和opacity了。

其实呢,opacity和transform能解决的问题已经很多了,尽量少的使用其他的属性去进行动画制作吧

最后呢,补充一些额外知识:

现代浏览器在使用CSS3动画时,以下四种情形绘制的效率更高:

  • 改变位置
  • 改变大小
  • 旋转
  • 改变透明度

其实,对于每一帧动画,浏览器可能要做以下工作

  1. 计算需要被加载到节点上的样式结果(样式重计算)
  2. 为每个节点生成图形和位置(重排)
  3. 将每个节点填充到图层中(重绘)
  4. 组合图层到页面上(图层重组)

如果我们需要使得动画的性能提高,需要做的就是减少浏览器在动画运行时所需要做的工作。最好的情况是,改变的属性仅仅是图层的组合,变换(transform)和透明度(opacity)就属于这种情况

现代浏览器如Chrome,Firefox,Safari和Opera都对变换和透明度采用硬件加速,但IE10+不是很确定是否硬件加速

一些常用的改变时会触发重布局的属性:
盒子模型相关属性会触发重布局:

  • width
  • height
  • padding
  • margin
  • display
  • border-width
  • border
  • min-height

定位属性及浮动也会触发重布局:

  • top
  • bottom
  • left
  • right
  • position
  • float
  • clear

改变节点内部文字结构也会触发重布局:

  • text-align
  • overflow-y
  • font-weight
  • overflow
  • font-family
  • line-height
  • vertival-align
  • white-space
  • font-size

这么多常用属性都会触发重布局,可以看到,他们的特点就是可能修改整个节点的大小或位置,所以会触发重布局

触发重绘的属性
修改时只触发重绘的属性有:

  • color
  • border-style
  • border-radius
  • visibility
  • text-decoration
  • background
  • background-image
  • background-position
  • background-repeat
  • background-size
  • outline-color
  • outline
  • outline-style
  • outline-width
  • box-shadow

这样可以看到,这些属性都不会修改节点的大小和位置,自然不会触发重布局,但是节点内部的渲染效果进行了改变,所以只需要重绘就可以了

结论:

动画给予了页面丰富的视觉体验。我们应该尽力避免使用会触发重布局和重绘的属性,以免失帧。最好提前申明动画,这样能让浏览器提前对动画进行优化。由于GPU的参与,现在用来做动画的最好属性是如下几个:

  • opacity
  • translate
  • rotate
  • scale

你可能感兴趣的:(CSS3动画性能优化)