跳转到内容

重排和重绘

浏览器的 重排(Reflow,也称为 Layout)重绘(Repaint) 是浏览器渲染页面时的重要过程。

重排(Reflow)

重排是指当页面布局或几何属性发生变化时,浏览器需要重新计算元素的位置和尺寸,从而更新整个页面的布局。

触发条件

以下操作可能会触发重排:

  • 添加或删除 DOM 元素。
  • 改变元素的几何属性,例如 widthheightpaddingmarginborder
  • 移动元素位置,例如改变 topleft 等定位属性。
  • 改变元素的内容,例如文本变化导致尺寸变化。
  • 修改窗口大小(resize 事件)。
  • 获取某些属性(会导致浏览器强制计算布局):
    • offsetTopoffsetLeftoffsetWidthoffsetHeight
    • scrollTopscrollLeftscrollWidthscrollHeight
    • getComputedStyle

性能影响

  • 重排是一个高成本操作,因为浏览器可能需要重新计算整个或部分 DOM 树中所有元素的布局。
  • 重排会导致后续的重绘,因此它比重绘开销更大。

重绘(Repaint)

重绘是指元素的外观发生改变(如颜色、背景、阴影等),但没有引起几何属性的变化时,浏览器仅需更新该元素的像素。

触发条件 以下操作可能会触发重绘:

  • 改变元素的样式,但不影响布局:
    • colorbackground-colorvisibility
    • outlinebox-shadow
  • CSS 伪类样式变化,如 :hover

性能影响

  • 重绘的成本比重排低,因为它不需要重新计算布局,只需要将更新后的样式应用到绘制表面上。

重排与重绘的关系

  • 重排一定会导致重绘,因为布局改变可能会改变元素的外观。
  • 重绘不一定会导致重排,因为外观变化不会影响布局。

性能优化

为了减少重排和重绘的影响,可以采取以下措施:

减少重排

  • 避免逐项修改样式:合并多次样式修改为一次(例如通过 classNamecssText)。
  • 批量操作 DOM:使用文档片段(DocumentFragment)或隐藏元素后再进行操作(通过 display: none)。
  • 避免频繁读取布局信息:将读取操作和写入操作分开(避免强制同步布局)。
  • 使用 CSS 动画代替 JavaScript 动画:CSS 动画由浏览器优化,性能更高。

减少重绘

  • 尽量减少视觉效果的频繁更新:例如动画时减少无关样式的变化。
  • 优化复杂的绘制操作:例如使用 will-change 提示浏览器优化绘制。

总结

操作类型描述触发条件性能影响
重排几何属性或布局变化尺寸、位置、添加/删除 DOM 节点等高(会引发重绘)
重绘外观变化但不影响布局背景、颜色、阴影等样式变化较低

TIP

内容来自 ChatGPT 仅作归纳总结