浏览器的渲染过程,DOM树和渲染树的区别

79 阅读2分钟

浏览器的渲染过程以及DOM树与渲染树的区别如下:


一、浏览器的渲染过程

浏览器的渲染流程是一个多阶段协作的过程,主要分为以下步骤:

  1. 解析HTML,构建DOM树

    • 浏览器解析HTML文档,将标签转换为DOM节点,生成树状结构(DOM树)。
    • 遇到<script>标签会暂停解析,执行脚本(除非标记为asyncdefer)。
  2. 解析CSS,构建CSSOM树

    • 解析CSS(内联、外部、浏览器默认样式),生成CSSOM树(CSS Object Model),描述样式规则如何应用到DOM节点。
  3. 合并DOM与CSSOM,生成渲染树(Render Tree)

    • 将DOM树与CSSOM树结合,过滤掉不可见节点(如display: none<head>等),生成渲染树。渲染树仅包含需要显示的节点及其样式。
  4. 布局(Layout/Reflow)

    • 计算渲染树中每个节点的几何信息(位置、大小),确定其在屏幕中的坐标。
  5. 绘制(Painting)

    • 将布局结果转换为屏幕上的实际像素,例如文本、颜色、边框等。
    • 可能分层绘制,最终通过合成(Composite)将各层合并为最终页面。

二、DOM树与渲染树的区别

特性DOM树渲染树(Render Tree)
组成元素包含所有HTML节点(包括不可见元素)。仅包含需要实际显示的节点(如display: none的节点会被排除)。
样式信息不包含样式信息。每个节点关联了完整的CSS样式(来自CSSOM)。
伪元素不包含伪元素(如::before)。包含伪元素,它们被视为渲染树的一部分。
动态更新修改DOM会触发渲染流程重建。渲染树的更新依赖DOM和CSSOM的变化。
结构差异完全反映HTML结构。可能因布局规则(如Flex/Grid)调整节点排列顺序。

三、关键差异示例

  1. 不可见节点

    • DOM树包含<div style="display: none">,但渲染树会忽略它。
  2. 伪元素

    • CSS伪类::before的内容会出现在渲染树中,但DOM树中没有对应节点。
  3. 样式影响

    • visibility: hidden的节点仍在渲染树中(占据布局空间),但不会显示内容;而display: none的节点会被完全排除。

四、优化渲染性能

  • 减少DOM层级:复杂的DOM会增加渲染树构建时间。
  • 避免频繁布局变更(如修改widthheight),触发重排(Reflow)。
  • 使用CSS动画替代JS动画:利用GPU加速的合成阶段(如transformopacity)。