返回

浏览器渲染的回流与重绘:终极指南

前端

在前端开发中,"回流"和"重绘"这两个术语经常出现,但它们经常被混淆或误解。在这篇文章中,我们将深入研究浏览器渲染过程,以清晰理解回流和重绘的原理及其对页面性能的影响。

浏览器渲染过程

浏览器渲染是一个复杂的、多步骤的过程。它涉及将 HTML、CSS 和 JavaScript 转换为在屏幕上显示的视觉表示。以下是浏览器渲染过程的基本步骤:

  1. 构建 DOM 树: 浏览器首先将 HTML 转换为文档对象模型 (DOM) 树,它代表了网页的结构和内容。
  2. 构建 CSSOM 树: 浏览器随后解析 CSS 并将其转换为 CSS 对象模型 (CSSOM) 树,它定义了网页的样式信息。
  3. 合并 DOM 和 CSSOM: 浏览器将 DOM 树和 CSSOM 树合并成称为渲染树的单一数据结构。
  4. 布局: 浏览器计算渲染树中每个元素的位置和大小,此过程称为布局或回流。
  5. 绘制: 浏览器遍历渲染树并绘制每个元素到屏幕上,此过程称为重绘。

回流

回流是指计算渲染树中元素的位置和大小的过程。它涉及对 DOM 树进行更改,例如添加或删除元素、更改元素的样式或大小,或改变窗口大小。

回流是一个耗时的过程,因为它需要重新计算整个渲染树。以下是一些常见会导致回流的操作:

  • 改变元素的几何属性(例如,宽度、高度、位置)
  • 添加或删除元素
  • 更改元素的字体或颜色
  • 滚动或缩放窗口
  • 触发窗口大小改变事件(例如,设备方向更改)

重绘

重绘是指绘制渲染树中元素到屏幕上的过程。它不涉及对 DOM 树或渲染树进行任何更改,而是将更新后的视觉表示绘制到屏幕上。

重绘通常比回流快,因为它只需要更新屏幕上受影响的区域。以下是一些常见导致重绘的操作:

  • 更改元素的颜色或背景
  • 更改元素的可见性(例如,从 display: none 切换到 display: block)
  • 触发 CSS 动画或过渡
  • 添加或删除 CSS 类

优化回流和重绘

减少回流和重绘的次数对于提高页面性能至关重要。以下是一些优化技巧:

  • 减少 DOM 操作: 避免频繁添加、删除或修改 DOM 元素。
  • 使用 CSS 类而不是内联样式: 更改元素的样式时,使用 CSS 类比内联样式更有效,因为它只触发一次回流。
  • 使用硬件加速: 硬件加速利用 GPU 来处理回流和重绘,这可以提高性能。
  • 延迟布局操作: 使用 requestAnimationFramesetTimeout 将布局操作延迟到帧结束时。
  • 使用 CSS 媒体查询: 根据设备或窗口大小对不同的样式应用条件可以防止不必要的重绘。
  • 避免使用浮动和绝对定位: 浮动和绝对定位会破坏布局流,从而导致不必要的回流。

结论

回流和重绘是浏览器渲染过程的两个重要方面。了解它们的原理及其对页面性能的影响对于前端开发人员至关重要。通过优化回流和重绘操作,您可以创建更快速、更响应的网页。