1. 整体流程概述
浏览器渲染流程主要包含以下几个关键步骤:
- 解析HTML构建DOM树
- 解析CSS构建CSSOM树
- 合并DOM和CSSOM形成渲染树
- 布局(Layout/Reflow)
- 绘制(Paint)
- 合成(Composite)
2. 详细步骤解析
2.1 解析HTML构建DOM树
<!DOCTYPE html>
<html>
<head>
<title>页面标题</title>
</head>
<body>
<div>
<h1>标题</h1>
<p>段落内容</p>
</div>
</body>
</html>DOM树结构:
Document
├── html
├── head
│ └── title
└── body
└── div
├── h1
└── p
关键特点:
- HTML解析是渐进式的,边下载边解析
- 遇到
<script>标签会阻塞解析 - 遇到
<link>标签会异步下载CSS
2.2 解析CSS构建CSSOM树
body {
font-size: 16px;
margin: 0;
}
div {
background: #f0f0f0;
padding: 20px;
}
h1 {
color: #333;
font-size: 24px;
}CSSOM树结构:
CSSOM
├── body
│ ├── font-size: 16px
│ └── margin: 0
├── div
│ ├── background: #f0f0f0
│ └── padding: 20px
└── h1
├── color: #333
└── font-size: 24px
2.3 合并形成渲染树
- 将DOM树和CSSOM树合并
- 只包含可见元素
- 排除
display: none的元素 - 包含
visibility: hidden的元素
3. 布局(Layout/Reflow)
3.1 布局过程
// 布局计算示例
const element = document.querySelector('.box');
const rect = element.getBoundingClientRect();
console.log('位置信息:', rect);
// 输出:{x: 100, y: 200, width: 300, height: 150, top: 200, right: 400, bottom: 350, left: 100}布局计算包括:
- 计算每个元素的位置和大小
- 处理盒模型(margin、border、padding、content)
- 处理浮动和定位
- 计算文本换行
3.2 触发重排的情况
// 会触发重排的操作
element.style.width = '200px'; // 改变尺寸
element.style.height = '100px'; // 改变尺寸
element.style.margin = '10px'; // 改变外边距
element.style.padding = '5px'; // 改变内边距
element.style.border = '1px solid'; // 改变边框
element.style.position = 'absolute'; // 改变定位
element.style.display = 'none'; // 改变显示方式4. 绘制(Paint)
4.1 绘制过程
- 将渲染树转换为屏幕上的像素
- 按照层叠顺序绘制
- 处理颜色、边框、阴影等视觉效果
4.2 触发重绘的情况
// 只触发重绘,不触发重排
element.style.color = 'red'; // 改变颜色
element.style.backgroundColor = 'blue'; // 改变背景色
element.style.borderRadius = '5px'; // 改变圆角
element.style.boxShadow = '0 0 5px'; // 改变阴影
element.style.opacity = '0.5'; // 改变透明度5. 合成(Composite)
5.1 图层合成
/* 创建新的合成层 */
.element {
transform: translateZ(0); /* 硬件加速 */
will-change: transform; /* 提示浏览器优化 */
position: fixed; /* 固定定位 */
z-index: 1000; /* 高层级 */
}合成层的特点:
- 独立的绘制层
- 硬件加速渲染
- 只影响自己的重绘,不影响其他元素