先上一张 chrome 浏览器渲染流程图,可以在 performance 面板查看
分为以下几个步骤:
大多数人对于CSS3的第一印象,就是可以通过3D(如transform)属性来开启硬件加速,许多同学在重构某一个项目时,考虑到动画性能问题,都会倾向将2D属性改为3D属性,但开启硬件加速的底层原理其实就在于将 Paint Layer 提升到了 Composite Layer
渲染层提升为合成层有一个先决条件,该渲染层必须是 SelfPaintingLayer。以下所讨论的渲染层提升为合成层的情况都是在该渲染层为 SelfPaintingLayer 前提下的
3D transform、will-change 设置为 opacity、transform 等 以及 包含 opacity、transform 的 CSS 过渡和动画 这 3 个经常遇到的提升合成层的情况请重点记住
我们可以使用 Chrome DevTools 工具来查看页面中合成层的情况
一种方式是在 Rendering 面板中勾选 Layer borders 选项,页面中的合成层就会被加上黄色边框
第二种是直接打开 Layers 面板查看,还会显示合成原因
提升为合成层简单说来有以下几点好处:
合成层的位图,会交由 GPU 合成,比 CPU 处理要快
当需要 repaint 时,只需要 repaint 本身,不会影响到其他的层
对于 transform 和 opacity 效果,不会触发 layout 和 paint
我们可以利用合成层来优化页面性能
合成层的好处是不会影响到其他元素的绘制,因此,为了减少动画元素对其他元素的影响,从而减少 paint,我们需要把动画效果中的元素提升为合成层。
提升合成层的最好方式是使用 CSS 的 will-change 属性。从上一节合成层产生原因中,可以知道 will-change 设置为 opacity、transform、top、left、bottom、right 可以将元素提升为合成层。
#target {
will-change: transform;
}
参考1:https://cansiny0320.vercel.app/browser-render-process#%E5%90%88%E6%88%90
参考2: https://github.com/AwesomeDevin/blog/issues/39