重绘和回流(Repaint & Reflow)的介绍,以及如何 进行优化

175 阅读2分钟

重绘(Repaint)和回流(Reflow)是 Web 开发中常见的两个概念,它们都会影响网页的性能,因此需要进行优化。

1、重绘(Repaint)

重绘指的是浏览器为元素更新样式而重新渲染所需的过程。当元素的样式更改但不影响其布局时,浏览器只需要进行重绘操作,并不需要重新计算元素的位置和大小,因为元素的盒模型并没有发生变化。

2、回流(Reflow)

回流指的是浏览器对网页进行重新排版和渲染的过程。当 DOM 元素的位置或者大小发生变化,或者添加、删除 DOM 元素时,会触发回流操作。这个过程需要重新计算所有相关元素的位置和大小,然后进行重新布局和重绘。

回流必定会发生重绘,重绘不一定会引发回流。

以下是一些常见的引起回流的操作:

  • 改变窗口大小
  • 改变字体大小
  • 添加或删除 DOM 元素
  • 改变元素位置
  • 激活 CSS 伪类(如 :hover)
  • 查询某些属性或调用某些方法,比如:
  1. offsetTop、offsetLeft、offsetWidth、offsetHeight

  2. scrollTop、scrollLeft、scrollWidth、scrollHeight

  3. clientTop、clientLeft、clientWidth、clientHeight

  4. width、height

  5. getComputedStyle()

  6. getBoundingClientRect()

如何进行优化?

由于回流操作非常消耗资源,因此我们需要尽可能地减少回流的次数。以下是一些常见的优化策略:

  1. 使用 CSS3 动画代替 JavaScript 动画。
  2. 避免频繁访问 DOM 元素的样式和计算属性。
  3. 尽量不要写一些无意义的标签,保证层级扁平。
  4. 将元素脱离文档流后再操作,可以减少回流的次数。这可以通过以下方式实现:
  • 使用 position: absolute 或 fixed 定位元素。

  • 将元素设置为 display: none; 并在操作完成后再重新显示。

  1. 批量更新 DOM 元素,而不是一条一条地更新。
  2. 对于复杂的动态变化,使用虚拟 DOM 技术进行优化。例如 React 框架就采用了虚拟 DOM 技术来减少真实 DOM 的操作。

通过上述优化策略,我们可以有效地减少页面的回流次数,提高网页的性能和用户体验。