重排和重绘
浏览器的 重排(Reflow,也称为 Layout) 和 重绘(Repaint) 是浏览器渲染页面时的重要过程。
重排(Reflow)
重排是指当页面布局或几何属性发生变化时,浏览器需要重新计算元素的位置和尺寸,从而更新整个页面的布局。
触发条件
以下操作可能会触发重排:
- 添加或删除 DOM 元素。
- 改变元素的几何属性,例如
width、height、padding、margin、border。 - 移动元素位置,例如改变
top、left等定位属性。 - 改变元素的内容,例如文本变化导致尺寸变化。
- 修改窗口大小(
resize事件)。 - 获取某些属性(会导致浏览器强制计算布局):
offsetTop、offsetLeft、offsetWidth、offsetHeightscrollTop、scrollLeft、scrollWidth、scrollHeightgetComputedStyle
性能影响
- 重排是一个高成本操作,因为浏览器可能需要重新计算整个或部分 DOM 树中所有元素的布局。
- 重排会导致后续的重绘,因此它比重绘开销更大。
重绘(Repaint)
重绘是指元素的外观发生改变(如颜色、背景、阴影等),但没有引起几何属性的变化时,浏览器仅需更新该元素的像素。
触发条件 以下操作可能会触发重绘:
- 改变元素的样式,但不影响布局:
color、background-color、visibilityoutline、box-shadow
- CSS 伪类样式变化,如
:hover。
性能影响
- 重绘的成本比重排低,因为它不需要重新计算布局,只需要将更新后的样式应用到绘制表面上。
重排与重绘的关系
- 重排一定会导致重绘,因为布局改变可能会改变元素的外观。
- 重绘不一定会导致重排,因为外观变化不会影响布局。
性能优化
为了减少重排和重绘的影响,可以采取以下措施:
减少重排
- 避免逐项修改样式:合并多次样式修改为一次(例如通过
className或cssText)。 - 批量操作 DOM:使用文档片段(
DocumentFragment)或隐藏元素后再进行操作(通过display: none)。 - 避免频繁读取布局信息:将读取操作和写入操作分开(避免强制同步布局)。
- 使用 CSS 动画代替 JavaScript 动画:CSS 动画由浏览器优化,性能更高。
减少重绘
- 尽量减少视觉效果的频繁更新:例如动画时减少无关样式的变化。
- 优化复杂的绘制操作:例如使用
will-change提示浏览器优化绘制。
总结
| 操作类型 | 描述 | 触发条件 | 性能影响 |
|---|---|---|---|
| 重排 | 几何属性或布局变化 | 尺寸、位置、添加/删除 DOM 节点等 | 高(会引发重绘) |
| 重绘 | 外观变化但不影响布局 | 背景、颜色、阴影等样式变化 | 较低 |
TIP
内容来自 ChatGPT 仅作归纳总结