重绘 (Repaint) 和回流 (Reflow)

92 阅读1分钟

重绘 (Repaint) 和回流 (Reflow)

重绘 (Repaint)

重绘是当节点需要更改外观但不会影响布局时发生的,例如改变颜色。

回流 (Reflow)

回流是当布局或几何属性需要改变时发生的(需要计算节点在设备视口(viewport)内的确切位置和大小)。回流必定会导致重绘,但重绘不一定会引发回流。回流所需的成本比重绘高得多,改变深层次的节点可能导致父节点的一系列回流。

以下几个动作可能导致性能问题:

  • 添加或删除可见的 DOM 元素
  • 元素位置发生变化
  • 元素尺寸发生变化(包括外边距、内边框、边框大小、高度和宽度等)
  • 内容发生变化,如文本变化或图片被另一个不同尺寸的图片替代
  • 元素的定位或浮动属性发生变化
  • 浏览器窗口尺寸变化(因为回流是根据视口大小计算元素位置和大小的)

减少重绘和回流

为提高性能,可以采取以下措施减少重绘和回流:

  • 批量修改 DOM
  • 对于复杂动画效果,使用绝对定位使其脱离文档流
  • 使用 CSS3 硬件加速(GPU加速)。例如,transformopacityfilters 这些动画不会引起回流重绘。