重绘(Repaint)和回流(Reflow)是 Web 开发中常见的两个概念,它们都会影响网页的性能,因此需要进行优化。
1、重绘(Repaint)
重绘指的是浏览器为元素更新样式而重新渲染所需的过程。当元素的样式更改但不影响其布局时,浏览器只需要进行重绘操作,并不需要重新计算元素的位置和大小,因为元素的盒模型并没有发生变化。
2、回流(Reflow)
回流指的是浏览器对网页进行重新排版和渲染的过程。当 DOM 元素的位置或者大小发生变化,或者添加、删除 DOM 元素时,会触发回流操作。这个过程需要重新计算所有相关元素的位置和大小,然后进行重新布局和重绘。
回流必定会发生重绘,重绘不一定会引发回流。
以下是一些常见的引起回流的操作:
- 改变窗口大小
- 改变字体大小
- 添加或删除 DOM 元素
- 改变元素位置
- 激活 CSS 伪类(如 :hover)
- 查询某些属性或调用某些方法,比如:
-
offsetTop、offsetLeft、offsetWidth、offsetHeight
-
scrollTop、scrollLeft、scrollWidth、scrollHeight
-
clientTop、clientLeft、clientWidth、clientHeight
-
width、height
-
getComputedStyle()
-
getBoundingClientRect()
如何进行优化?
由于回流操作非常消耗资源,因此我们需要尽可能地减少回流的次数。以下是一些常见的优化策略:
- 使用 CSS3 动画代替 JavaScript 动画。
- 避免频繁访问 DOM 元素的样式和计算属性。
- 尽量不要写一些无意义的标签,保证层级扁平。
- 将元素脱离文档流后再操作,可以减少回流的次数。这可以通过以下方式实现:
-
使用 position: absolute 或 fixed 定位元素。
-
将元素设置为 display: none; 并在操作完成后再重新显示。
- 批量更新 DOM 元素,而不是一条一条地更新。
- 对于复杂的动态变化,使用虚拟 DOM 技术进行优化。例如 React 框架就采用了虚拟 DOM 技术来减少真实 DOM 的操作。
通过上述优化策略,我们可以有效地减少页面的回流次数,提高网页的性能和用户体验。