浏览器渲染原理,回流,重绘的概念和原理

89 阅读3分钟

浏览器渲染原理,回流,重绘的概念和原理

浏览器的渲染原理、回流(Reflow)和重绘(Repaint)是前端性能优化中的重要概念。理解这些概念有助于编写高性能的代码,减少页面卡顿和性能问题。

  1. 浏览器渲染原理

浏览器的渲染过程可以分为以下几个步骤:

(1) 解析 HTML 和 CSS

  • 解析 HTML:浏览器将 HTML 文档解析为 DOM(Document Object Model)树。

  • 解析 CSS:浏览器将 CSS 文件解析为 CSSOM(CSS Object Model)树。

(2) 构建渲染树(Render Tree)

  • 将 DOM 树和 CSSOM 树结合,生成渲染树。渲染树只包含需要显示的节点(如 display: none 的元素不会包含在渲染树中)。

(3) 布局(Layout)

  • 计算渲染树中每个节点的几何信息(如位置、大小等),这一过程也称为 回流(Reflow)

(4) 绘制(Paint)

  • 将渲染树的每个节点绘制到屏幕上,这一过程也称为 重绘(Repaint)

(5) 合成(Composite)

  • 将多个图层合成为最终的页面图像,显示在屏幕上。
  1. 回流(Reflow)

(1) 什么是回流?

回流是指浏览器重新计算渲染树中元素的几何属性(如位置、大小等),并重新布局的过程。回流会导致整个渲染树的重新计算,性能开销较大。

(2) 触发回流的操作

以下操作会触发回流:

  • 添加或删除 DOM 元素。

  • 改变元素的位置、大小(如 widthheightmarginpadding 等)。

  • 改变窗口大小。

  • 修改页面默认字体。

  • 激活 CSS 伪类(如 :hover)。

  • 读取某些属性(如 offsetWidthoffsetHeightclientWidth 等),因为浏览器需要确保返回最新的值。

(3) 如何减少回流?

  • 避免频繁操作 DOM:尽量一次性修改 DOM,而不是多次修改。

  • 使用 transformopacity:这些属性不会触发回流。

  • 使用 position: absolutefixed:使元素脱离文档流,减少对其他元素的影响。

  • 批量修改样式:使用 classListcssText 批量修改样式。

  1. 重绘(Repaint)

(1) 什么是重绘?

重绘是指浏览器重新绘制受影响的元素,但不改变其几何属性(如颜色、背景等)。重绘的性能开销比回流小。

(2) 触发重绘的操作

以下操作会触发重绘:

  • 改变元素的颜色、背景、边框等样式。

  • 修改 visibilityoutline 等属性。

(3) 如何减少重绘?

  • 避免频繁修改样式:尽量一次性修改样式。

  • 使用 requestAnimationFrame:将样式修改操作放在下一帧执行。

  1. 回流与重绘的关系
  • 回流一定会触发重绘:因为回流会改变元素的几何属性,浏览器需要重新绘制元素。

  • 重绘不一定会触发回流:如果只是修改颜色等不影响几何属性的样式,只会触发重绘。

  1. 性能优化建议

(1) 减少 DOM 操作

  • 使用文档片段(DocumentFragment)批量插入 DOM 元素。

  • 使用虚拟 DOM 技术(如 Vue、React)减少直接操作 DOM。

(2) 优化样式修改

  • 使用 classListcssText 批量修改样式。

  • 将需要多次修改的样式放在一个 class 中,然后一次性切换 class

(3) 使用 transformopacity

  • 这些属性不会触发回流和重绘,适合用于动画效果。

(4) 避免强制同步布局

  • 避免在 JavaScript 中频繁读取布局属性(如 offsetWidthoffsetHeight 等),因为这些操作会强制浏览器立即执行回流。

(5) 使用 requestAnimationFrame

  • 将样式修改操作放在 requestAnimationFrame 中执行,确保在下一帧渲染前完成。

总结

  • 回流:重新计算元素的几何属性,性能开销较大。

  • 重绘:重新绘制元素,性能开销较小。

  • 优化建议:减少 DOM 操作、批量修改样式、使用 transformopacity、避免强制同步布局。

理解浏览器的渲染原理、回流和重绘的概念,可以帮助开发者编写高性能的前端代码,提升用户体验。

更多vue相关插件及后台管理模板可访问vue admin reference,代码详情请访问github