Repaint and Reflow
在了解重绘和重排之前,我们需要知道浏览器渲染的基本流程,主要分为以下几个步骤:
-
构建 DOM 树:浏览器解析 HTML 文件,并根据 HTML 标签的嵌套关系构建 DOM 树。
-
构建 CSSOM 树:浏览器解析 CSS 文件,并根据选择器的优先级和层叠规则构建 CSSOM 树。
-
合并生成渲染树:将 DOM 树和 CSSOM 树结合,生成渲染树(Render Tree),即每个节点的样式属性和内容信息的结合体。
-
布局(Layout):根据渲染树中每个节点的大小、位置等信息,计算出每个节点在屏幕上的精确位置。
-
绘制(Paint):将渲染树的每个节点按照计算出的精确位置绘制到屏幕上。
-
合成(Composite):将绘制的节点合成为一张图像,并在屏幕上显示。
以上步骤中,步骤 1-3 构建了网页的结构和样式,步骤 4-6 则是将网页结构和样式转换为可视化的图像的过程。在渲染过程中,每个节点的样式属性、位置信息等都会对性能产生影响,因此优化这些过程是提高网页性能的关键。
重绘 Repaint
重绘是指当DOM的样式属性(如opacity, color, background-color, visibility等)发生变化时,浏览器会根据新的样式属性重新绘制页面上相应的元素。这个过程不需要重新计算渲染树,但是会重新生成图层和绘制元素,是比较消耗性能的。
- Occurs when changes affect the visibility.
- Triggers examples:
opacity
,color
,background-color
,visibility
.
重排 Reflow
重排是指当DOM发生结构变化(如增删节点、改变位置等)时,浏览器需要重新计算渲染树并确定每个节点的几何信息(位置和大小),然后将这些信息应用到页面上。这个过程会涉及到重新计算布局,重新排列元素等操作,是比较消耗性能的。
- Occurs when the changes affect the layout.
- Triggers examples:
width
,position
,float
. - Recalculate of positions and dimensions.
- Has a bigger impact, changing a single element can affect all children, ancestors, and siblings or the whole document.
- Triggers (change dom or css, scrolling, user actions like
focus
). Reflow
only has acost
if the document has changed andinvalidated
thelayout
.Something Invalidates
+Something Triggers
=Costly Reflow
.
减少重排和重绘
- 使用CSS3的transform属性代替position和top/left等属性来移动元素,因为transform属性不会引起重排和重绘。
- 将需要多次操作的DOM节点缓存起来,避免多次访问和操作。
- 使用documentFragment来批量操作DOM节点,减少重排和重绘的次数。
- 使用虚拟DOM技术,将DOM操作尽量减少到最少。
- 避免频繁修改样式属性,可以将需要修改的样式属性合并到一起,一次性修改。
- 尽量减少页面的层级嵌套,避免过多的图层合成,因为图层合成也会引起重绘和重排。