css图层

2,390 阅读2分钟

浏览器渲染页面时,会将页面分为多个图层,然后组合成一个完整视图进行展示

在渲染dom的时候,浏览器实际做的工作是

1,将dom分割为多个图层

2,对每个图层计算样式结果(Recalculate style-样式重计算)

3,为每个节点生成图形和位置(重排,回流)(重要)

4,将每个节点绘制到图层位图中(重绘)(重要)

5,组合多个图层到页面,生成最终屏幕显示

图层创建条件:

1,拥有3d变换的css属性

2.video标签

3,canvas标签

4,css的变换属性will-change

重排和重绘

重绘是一个元素外观改变所引起的浏览器行为,例如改变outline等属性,浏览器会根据这些新属性重新绘制

使元素呈现新的外观,重绘不会带来重新布局,所有重绘不一定重排。

渲染对象在创建完成并添加到渲染树的时候,并不包含位置和大小信息,计算这些值的过程成为布局或者重排。重排一定会引起重绘。

查看页面的所有图层

通过devtools中的layers可以看到页面的所有图层。

重绘重排的基本单位是图层,所以gif的时候最好单独开一个图层,否则如果gif的图层是document的时候,所有的元素都需要重排或者重绘很影响效率。

优化方案:

1,元素移动最好使用transofrm代替left top,减少重排或者重绘

2,visibility比display好一点,不会触发重排。

3,opacity配合图层使用,既不触发重排也不触发重绘

4,不要使用table布局

table-cell

5,将多次样式的修改定义为一个class,一次性修改

6,修改dom离线再修改

display:none不再渲染树中,离线后再进行修改,这样隐藏和显示只触发两次重排重绘

7,利用文档碎片,vue使用了这种方式进行修改,把多次操作合并为一次操作,虚拟Dom,html5提出了文档碎片

8,不要把获取某些dom节点的变量放在循环中,每次获取也会触发节点的重排重绘,因为计算属性的精确数据

9,动画实现过程中,使用GPU硬件加速:transform:translate

10,为动画元素新建图层,提高动画元素的z-index,与其他元素隔开,图层不能随便开,会影响性能