01. 浏览器渲染过程详解
1. 核心流程概述
浏览器渲染过程是将 HTML、CSS 和 JavaScript 代码转换为可视化页面的关键流程,主要包含以下阶段:
2. 详细步骤说明
2.1 构建 DOM 树
- 输入:原始 HTML 字节流
- 处理:
- 字节 → 字符(字符编码解码)
- 字符 → Tokens(词法分析)
- Tokens → DOM 节点
- 节点连接形成树结构
- 示例:html转换为:
<div> <p>Hello</p> </div>
textDocument └── div └── p └── "Hello"
2.2 构建 CSSOM 树
- 特点:
- 级联规则处理(选择器优先级)
- 继承属性传播
- 最终样式计算公式:
- 阻塞点:
<link>
标签会阻塞渲染
2.3 生成渲染树
- 合并逻辑:
- 遍历 DOM 树
- 过滤不可见节点(如
<head>
、display: none
) - 附加 CSSOM 计算样式
- 伪元素处理:
:before
、:after
会作为独立节点加入
2.4 布局计算(Reflow)
坐标系转换:
关键计算:
- 盒模型参数
- 定位模式:static/relative/absolute 的区别
- Flex/Grid 布局的特殊计算
- 盒模型参数
2.5 分层与绘制
- 分层策略:text
Layer 0 (Root) ├── Layer 1 (Position: fixed) ├── Layer 2 (Opacity: 0.5) └── Layer 3 (3D Transform)
- 绘制顺序:
- 背景颜色
- 背景图片
- 边框
- 子元素
- 轮廓
3. 性能优化要点
减少 Reflow:
- 批量 DOM 操作
- 使用
requestAnimationFrame
- 避免频繁读取布局属性(如 offsetTop)
GPU 加速:
css.optimized { transform: translateZ(0); /* 触发硬件加速 */ will-change: transform; /* 预先声明变化 */ }
关键渲染路径优化:
textHTML 解析 → 关键 CSS 加载 → 首屏内容渲染 → 非关键资源加载
4. 现代渲染改进
- 增量渲染:Chrome 的 Blink 引擎支持部分树更新
- 光栅化线程化:将绘制任务分配到多个 CPU 核心
- Jank 预测:通过历史帧时间预测卡顿风险
该流程的时间复杂度可近似表示为: