浏览器的重排与重绘是什么意思?

为了理解重排与重绘,我们首先需要了解一点浏览器渲染的基础知识 ~

网页生成分为五步:

1. HTML 被 HTML 解析器解析成 DOM 树

2. CSS 被 CSS 解析器解析成 CSSOM 树

3. 结合 DOM 树和 CSSOM 树,生成一颗渲染树(Render Tree)

4. 将所有渲染树的所有子节点进行平面合成,生成布局(flow)  -- 重排(回流)

5. 将布局绘制(paint)在屏幕上   -- 重绘

其中 4 5 步是最耗时的,这两步就是我们常说的 渲染 

浏览器的重排与重绘是什么意思?

 网页生成时候,至少会渲染一次,在用户访问的过程中,可能会不断的重新渲染,即执行上述第 4 5 步,或者只执行第 5 步。

简单来说:

重排指重新生成布局,重新排列元素。例如margin: 10px 变成 margin: 20px,会导致重排;

重绘指重新描绘已经生成的布局。例如颜色改变,仅会触发重绘

重排必定会导致重绘,重绘不一定有重排。因为重排在重绘前执行。所以上述 margin 改变 ,重排完成后触发重绘,成本是很高的。

 引起重排的属性和方法

width height margin padding
display border position overflow
clientWidth clientHeight clientTop clientLeft
offsetWudth offsetHeight offsetTop offsetLeft
scrollWidth scrollHeight scrollTop scrollLeft
scrollIntoView() scrollTo() getComputedStyle()  
getBoundingClientRect() scrollIntoViewIfNeeded()    

 引起重绘的属性

color border-style visibility background
text-decoration background-image background-position background-repeat
outline-color outline outline-style border-radius
outline-width box-shadow background-size  

 

样式优化建议

 

未完待续 ~