浏览器的渲染过程以及DOM树与渲染树的区别如下:
一、浏览器的渲染过程
浏览器的渲染流程是一个多阶段协作的过程,主要分为以下步骤:
-
解析HTML,构建DOM树
- 浏览器解析HTML文档,将标签转换为DOM节点,生成树状结构(DOM树)。
- 遇到
<script>标签会暂停解析,执行脚本(除非标记为async或defer)。
-
解析CSS,构建CSSOM树
- 解析CSS(内联、外部、浏览器默认样式),生成CSSOM树(CSS Object Model),描述样式规则如何应用到DOM节点。
-
合并DOM与CSSOM,生成渲染树(Render Tree)
- 将DOM树与CSSOM树结合,过滤掉不可见节点(如
display: none、<head>等),生成渲染树。渲染树仅包含需要显示的节点及其样式。
- 将DOM树与CSSOM树结合,过滤掉不可见节点(如
-
布局(Layout/Reflow)
- 计算渲染树中每个节点的几何信息(位置、大小),确定其在屏幕中的坐标。
-
绘制(Painting)
- 将布局结果转换为屏幕上的实际像素,例如文本、颜色、边框等。
- 可能分层绘制,最终通过合成(Composite)将各层合并为最终页面。
二、DOM树与渲染树的区别
| 特性 | DOM树 | 渲染树(Render Tree) |
|---|---|---|
| 组成元素 | 包含所有HTML节点(包括不可见元素)。 | 仅包含需要实际显示的节点(如display: none的节点会被排除)。 |
| 样式信息 | 不包含样式信息。 | 每个节点关联了完整的CSS样式(来自CSSOM)。 |
| 伪元素 | 不包含伪元素(如::before)。 | 包含伪元素,它们被视为渲染树的一部分。 |
| 动态更新 | 修改DOM会触发渲染流程重建。 | 渲染树的更新依赖DOM和CSSOM的变化。 |
| 结构差异 | 完全反映HTML结构。 | 可能因布局规则(如Flex/Grid)调整节点排列顺序。 |
三、关键差异示例
-
不可见节点
- DOM树包含
<div style="display: none">,但渲染树会忽略它。
- DOM树包含
-
伪元素
- CSS伪类
::before的内容会出现在渲染树中,但DOM树中没有对应节点。
- CSS伪类
-
样式影响
visibility: hidden的节点仍在渲染树中(占据布局空间),但不会显示内容;而display: none的节点会被完全排除。
四、优化渲染性能
- 减少DOM层级:复杂的DOM会增加渲染树构建时间。
- 避免频繁布局变更(如修改
width、height),触发重排(Reflow)。 - 使用CSS动画替代JS动画:利用GPU加速的合成阶段(如
transform、opacity)。