CSS高性能动画

前置知识点

  • 重绘与回流
  • 为什么transform更加平滑?CSS3动画卡顿优化解决方案
重绘与回流
CSS性能让javascript变慢

会的,频繁触发重绘与回流,会导致UI频繁渲染,最终导致js变慢。

有两个线程:一个线程JavaScript解析,一个线程是UI渲染,这两个其实是互斥的两个线程。

当javascript 线程运行的时候 ui 线程则会中止暂停,反之亦然。

那这是为什么呢?

原因是,当ui 线程运行对页面进行渲染的时候 js 脚本难免会涉及到页面视图上的一些样式的改变,为了使这个改变更加准确 js 脚本只好等待ui 线程渲染完成的时候才去执行。

所以当一个页面的元素样式改动频繁的时候ui 线程就会持续渲染,造成js 代码反应慢半拍,卡顿的情况。

回流
  • 当render tree中的一部分(或全部)因为元素的规模尺寸,布局,隐藏等改变而需要重新构建。这就称为回流(reflow)
  • 当页面布局和几何属性改变时就需要回流
  • 触发页面重布局的属性:
    • 盒子模型相关属性会触发重布局:width ,height,padding,margin,display,border-width,border,min-heigh。
    • 定位属性及浮动也会触发重布局:top,bottom,left,right,position,float,clear
    • 改变节点内部文字结构也会触发重布局:text-align,overflow-y,font-weight,overflow,font-family,line-height,vertival-align,white-space,font-size
重绘
  • 当render tree中的一些元素需要更新属性,而这些属性只是影响元素的外观,风格,而不会影响布局的,比如background-color。则就叫称为重绘。
  • 只触发重绘的属性:
    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

总结:回流必将引起重绘,而重绘不一定会引起回流
现在我们知道了那些属性会触发回流,那如何避免回流呢?

其实有两个方法:

第一,不使用以上能触发图层回流的属性,

第二,建立一个图层,让回流在这些图层里面进行,限制回流和重绘的范围,减少浏览器的运算工作量

新建DOM的过程
  • 获取DOM后分割为多个图层
  • 对每个图层的节点计算样式结果(Recalculate style–样式重计算)
  • 为每个节点生成图形和位置(Layout–回流和重布局)
  • 将每个节点绘制填充到图层位图中(Paint Setup和Paint–重绘)
  • 图层作为纹理上传至GPU
  • 符合多个图层到页面上生成最终屏幕图像(Composite Layers–图层重组)

将频繁重绘回流的DOM元素单独作为一个独立图层,那么这个DOM元素的重绘和回流的影响只会在这个图层中。

  • 3D或透视变换(perspective transform)CSS属性
  • 使用加速视频解码的节点
  • 拥有3D(WebGL)上下文或加速的2D上下文的节点
  • 混合插件(如Flash)
  • 对自己的opacity做CSS动画或使用一个动画webkit变换的元素
  • 拥有加速CSS过滤器的元素
  • 元素有一个包含复合层的后代节点(一个元素拥有一个子元素,该子元素在自己的层里)
  • 元素有一个z-index较低且包含一个复合层的兄弟元素(换句话说就是该元素在复合层上面渲染)
    如何手动创建图层的两种方法
  • will-change:transform
  • transform:translateZ(0)
    Chrome浏览器的more tools下面的Layers能查看图层信息,rendering能查看浏览器页面正在重绘的元素。

用图层可以减少重绘和回流,但是图层会有合成的消耗,因此两者之间需要一个balance!

为什么transform更加平滑?CSS3动画卡顿优化解决方案

传送门

高性能Web动画和渲染原理系列(3)——transform和opacity为什么高性能

传送门
算法原因,并不是硬件加速

参考文章:

  • https://www.jianshu.com/p/ffdaa5536f71
  • https://zhuanlan.zhihu.com/p/88432590
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值