CSS渲染性能

332 阅读2分钟

浏览器渲染过程

我们的浏览器渲染分为以下步骤(包括但不限于):

1、构建html树 (dom)

2、构建css树(cssom)

3、将两棵树合并成一棵树 (render tree)

4、Layout布局(文档流、盒模型、计算大小、位置)【主要动html或有关的css】

5、paint绘制(绘制颜色、阴影等)【主要动css】

6、compsite合并 根据层叠关系展示画面

每次打开页面,浏览器都会通过渲染引擎执行一系列复杂的操作,包含以上步骤最终实现一个页面。但是我们经常更新样式来达到一些效果,使用js来更新样式,一共分三种渲染方式:

为什么会有三种方式?

根据渲染规则,我们可以发现,假设我把html改变了(位置、盒模型、大小)等有关的css或本身(删除节点),这一过程可能会经过layout布局阶段。

但是如果我们只是改变了background-color,那么就可能不会经过layout,会直接经过paint绘制阶段。

如果我们用了transform,那么既不会经过layout布局阶段,又不会经过paint阶段。会直接到达合成阶段compsite。(虽然有可能改变位置、大小。)

这样做的结果是浏览器整个渲染效率提高了。

怎么知道触发流程

有两种方式。

1、使用【谷歌开发者工具-rendering-paint flashing】挨个试

变绿就代表绘制了 paint

案例1:

代码:

.div{
  width:100px;
  height:100px;
  border:1px solid red;
}
.div:hover{
  background-color:red;
}

通过鼠标移动来改变div的background,会发现被鼠标移动到的盒子变绿了,但是其他的没变绿,代表只有这个元素被绘制了。那就代表没经过layout属性。

不信我们再看:

案例2:

我把代码修改为

.div:hover{
  height:110px
}

再来看paint flashing 可以看到全部变绿,说明经历了layout阶段

案例3:

再把代码改成:

.div:hover{
  transformtranslateX(20px);
}

在开始和结束时,会变绿,但是移动过程中不会变绿,说明transform时没有触发layout跟paint阶段。至于为什么开始结束时会变绿,我的理解是可能是抬起或放下时触发了文档流。

2、通过网站知道触发流程(比较权威)

csstriggers.com/

参考文档

google渲染性能{ class:}

渲染树构建、布局及绘制

如何优化动画性能