什么是浏览器的重绘与回流

2020-06-09  本文已影响0人  白水螺丝

前言

最近看了幕课网 web 前端性能优化的课程,其中说到了浏览器的回流(reflow) 及 重绘(repaint)。觉得以后面试或许会被问到所以做一下笔记:

课程从回流及重绘这两个点延伸出了一个知识点就是 "css 会影响 javascrip 执行时间导致 javascript 脚本变慢"。

浏览器渲染一个网页的时候会启用两条线程:一条渲染javascript 脚本,另一条渲染 ui 即css 样式的渲染。但这两条线程是互斥的。当javascript 线程运行的时候 ui 线程则会中止暂停,反之亦然。

那这是为什么呢?

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

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

回流和重绘究竟是什么

回流:当render tree 的一部分或全部的元素因改变了自身的宽高,布局,显示或隐藏,或者元素内部的文字结构发生变化 导致需要重新构建页面的时候,回流就产生了

重绘:当一个元素自身的宽高,布局,及显示或隐藏没有改变,而只是改变了元素的外观风格的时候,就会产生重绘。例如你改变了元素的background-color....

因此得出了一个结论:

回流必定触发重绘,而重绘不一定触发回流

触发回流的css 属性有这些:

image

而触发重绘的有这些:

image

现在我们知道了那些属性会触发回流,那如何避免回流呢?

其实有两个方法:

css 中有一个重要的概念的就是 "划分图层"。

在页面加载完dom之后,浏览器会根据自身制定的一些特殊css 属性对页面进行划分为一个个图层。
例如:

图层的优点就是 :当一个元素在自己图层内发生变化的时候它的回流和重绘只会在图层内部发生,从而减少了浏览器对于重绘与回流的运算量。

那图层内部究竟干了什么呢?

首先,图层对图层里面的节点做回流和重布局运算,计算出他们的样式,然后,对它们生成图形和位置。紧跟着,将每个节点绘制填充到图层位图中。再然后,图层作为纹理发送到GPU 上。最后,将所有图层合并,显示在浏览器的页面上。

图层虽好,但是如果滥用图层的话就会让页面因为进行了太多合并运算导致页面卡顿。

所以说,图层的用途应该让给那些经常要进行位置结构,布局变换的元素去使用。例如轮播图。

那我们如创建一个图层呢?

就拿chrome 来说,创建一个图层要有以下其中一个条件:

那如果我们使用属性又有那些可替换的属性可以优化回流与重绘

一共有一下9点:

上一篇下一篇

猜你喜欢

热点阅读