理解Web渲染:重排、重绘和性能优化

介绍

Web 渲染在用户体验网站方面起着至关重要的作用。从布局计算到视觉更新,重排和重绘等概念可以显著影响性能和用户满意度。随着开发人员追求更快、更具交互性的应用程序,了解渲染的细微差别至关重要。本文深入探讨了 Web 渲染的机制、其性能影响以及优化策略。

Web 渲染期间会发生什么?

当浏览器呈现网页时,它会经历几个阶段:

  • 解析 HTML 浏览器从 HTML 源代码构建 DOM(文档对象模型)树。
  • CSSOM 构造 CSS 经过解析后创建 CSSOM(CSS 对象模型),它定义元素的样式。
  • 渲染树构建 DOM 和 CSSOM 组合形成渲染树,其中包含所有可见元素。
  • 布局(重排)浏览器计算元素的位置和尺寸。
  • 绘画(重新绘制)根据布局和样式将像素绘制到屏幕上。
  • 合成浏览器将各层组合起来以生成显示给用户的最终图像。
  • 重排与重绘

    重排

  • 定义:当 DOM 的更改影响布局时,就会发生重排。这会迫使浏览器重新计算位置和尺寸。
  • 常见触发器:调整浏览器窗口大小、更改元素大小或位置、添加/删除元素、修改影响布局的属性(例如宽度、高度、边距)
  • 重绘

  • 定义:当变化仅影响视觉样式而不改变布局时,就会发生重绘。
  • 常见触发器:更改颜色、背景或可见性、添加 CSS 边框、调整阴影或不透明度
  • **主要区别:**

    重排的计算量比重绘更大,因为它涉及布局重新计算,而这可能会影响到其他元素。

    性能影响

    回流焊的成本

    重排的成本很高,因为它们需要重新计算页面中可能很大一部分的布局。频繁的重排可能会导致明显的性能问题,尤其是在资源受限的设备上。

    重绘和合成

    尽管重绘的成本低于重排,但如果触发次数过多,仍会降低性能。现代浏览器优化了合成以最大限度地减少重绘,但管理重绘仍然很重要。

    对渲染管道的影响

    频繁的重排和重绘可能会破坏渲染管道,从而导致:

  • 卡顿:滚动或动画过程中出现明显的卡顿。
  • 增加 CPU/GPU 使用率:缩短移动设备的电池寿命。
  • 优化渲染的最佳实践

    减少回流

  • 有效使用 CSS 属性:避免触发重排的属性(宽度、高度、边距)。
  • 使用 Flexbox 或 Grid 布局:这些现代布局技术更加高效。
  • 避免循环中的 JavaScript DOM 操作:使用 documentFragment 或使用虚拟 DOM 的框架(例如 React)进行批量更新。
  • 使用 CSS Transforms 进行动画,而不是使用诸如顶部或左侧之类的属性。
  • 减少重绘

  • 尽量减少使用触发重绘的 CSS 属性,例如阴影和渐变。
  • 使用visibility: hidden而不是display: none来隐藏元素而不触发重排。
  • 利用 GPU 加速优化不透明度转换。
  • 利用现代浏览器功能

  • 使用 will-change CSS 属性:告知浏览器潜在的变化以优化渲染。
  • 使用 requestAnimationFrame 进行优化:将 JavaScript 动画与浏览器的刷新率同步。
  • 使用 Intersection Observer 进行延迟加载:减少不必要的屏幕外元素渲染。
  • 诊断渲染问题的工具

  • Chrome DevTools 性能选项卡:分析渲染性能并识别重排/重绘。渲染选项卡:模拟油漆闪烁以可视化重绘。
  • Lighthouse 提供性能审计,包括渲染阻止资源。
  • Firefox Developer Tools 和 Safari Web Inspector 等浏览器分析工具提供了类似的见解。
  • 结论

    Web 渲染效率是高性能、用户友好型应用程序的基石。通过了解重排和重绘之间的区别并实施优化策略,开发人员可以提供更流畅、响应更快的 Web 体验。在工作流程中优先考虑渲染性能,以在现代 Web 开发的竞争格局中保持领先地位。

    **元描述:**

    掌握网页渲染的艺术,深入了解重排、重绘和优化策略,以获得更好的性能和用户体验。

    **TLDR - 浏览者的亮点:**

  • 重排影响布局;重绘影响视觉风格。
  • 频繁的重排和重绘会破坏渲染并降低性能。
  • 最佳实践包括批量处理 DOM 更改、使用现代布局系统以及利用 GPU 加速。
  • 使用 Chrome DevTools 和 Lighthouse 等工具诊断渲染问题。