重绘和重排(回流)

2020-05-15  本文已影响0人  dingFY

一、浏览器渲染HTML的步骤

  1. HTML被HTML解析器解析成DOM Tree, CSS则被CSS解析器解析成CSSOM Tree。
  2. DOM Tree和CSSOM Tree解析完成后,被附加到一起,形成渲染树(Render Tree)。
  3. 节点信息计算(重排),这个过程被叫做Layout(Webkit)或者Reflow(Mozilla)。即根据渲染树计算每个节点的几何信息生成布局。
  4. 渲染绘制(重绘),这个过程被叫做(Painting 或者 Repaint)。即根据计算好的信息绘制整个页面。
  5. Display显示到屏幕上

以上5步简述浏览器的一次渲染过程,每一次的dom更改或者css几何属性更改,都会引起一次浏览器的重排/重绘过程,而如果是css的非几何属性更改,则只会引起重绘过程。所以说重排一定会引起重绘,而重绘不一定会引起重排重绘的开销较小,回流的代价较高。

二、重排(Relayout/Reflow)

所谓重排,实际上是根据渲染树中每个渲染对象的信息,计算出各自渲染对象的几何信息(DOM对象的位置和尺寸大小),并将其安置在界面中的正确位置。

重排也叫回流,实际上,reflow的字面意思也是回流,之所以有的叫做重排,也许是因为重排更好理解,更符合中国人的思维。标准文档之所以叫做回流(Reflow),是因为浏览器渲染是基于“流式布局”的模型,流实际就使我们常说的文档流,当dom或者css几何属性发生改变的时候,文档流会受到波动联动的去更改,流就好比一条河里的水,回流就好比向河里扔了一块石头,激起涟漪,然后引起周边水流受到波及,所以叫做回流,这样理解似乎更标准更规范,不过叫什么并不重要,重要的是我们真正理解了这个过程就行。

【1】重排的影响范围:

由于浏览器渲染界面是基于流式布局模型(Flow Based Layout),也就是某一个DOM节点信息更改了,就会触发重排。只是这个DOM更改程度会决定周边DOM更改范围,即全局范围和局部范围

【2】会引起重排的操作:

【3】常见引起重排属性和方法:

|

|

|

|

|

三、重绘(Repainting)

相比重排,重绘就简单多了,所谓重绘,就是当页面中元素样式的改变并不影响它在文档流中的位置时,例如更改了字体颜色,浏览器会将新样式赋予给元素并重新绘制的过程称。

【1】常见引起浏览器绘制过程的属性包含:

|

|

|

|

|

四、优化策略

其实浏览器很聪明,不可能每次修改样式就 reflow 或者 repaint 一次,一般来说,浏览器会积累一批操作,然后做一次 reflow。但是我们也应该减少重绘重排的次数。

我们知道操作DOM是一个高成本的操作,不仅是因为本身js与DOM的链接访问,还包括操作DOM后引起一连串的重排,因此,从性能优化角度,我们可以从以下几个方面着手:

【1】减少DOM操作

【2】减少重排

【3】css及优化动画

上一篇 下一篇

猜你喜欢

热点阅读