Skip to content

01. 浏览器渲染过程详解

1. 核心流程概述

浏览器渲染过程是将 HTML、CSS 和 JavaScript 代码转换为可视化页面的关键流程,主要包含以下阶段:

2. 详细步骤说明

2.1 构建 DOM 树

  • 输入:原始 HTML 字节流
  • 处理
    1. 字节 → 字符(字符编码解码)
    2. 字符 → Tokens(词法分析)
    3. Tokens → DOM 节点
    4. 节点连接形成树结构
  • 示例
    html
    <div>
      <p>Hello</p>
    </div>
    转换为:
    text
    Document
    └── div
        └── p
            └── "Hello"

2.2 构建 CSSOM 树

  • 特点
    • 级联规则处理(选择器优先级)
    • 继承属性传播
    • 最终样式计算公式:

      finalStyle=cascade(inlineStyle,authorStyle,userStyle,browserStyle)\rm finalStyle = cascade(inlineStyle, authorStyle, userStyle, browserStyle)

  • 阻塞点<link> 标签会阻塞渲染

2.3 生成渲染树

  • 合并逻辑
    1. 遍历 DOM 树
    2. 过滤不可见节点(如 <head>display: none
    3. 附加 CSSOM 计算样式
  • 伪元素处理:before:after 会作为独立节点加入

2.4 布局计算(Reflow)

  • 坐标系转换

  • 关键计算

    • 盒模型参数

      width=content+padding+border\rm width = content + padding + border

    • 定位模式:static/relative/absolute 的区别
    • Flex/Grid 布局的特殊计算

2.5 分层与绘制

  • 分层策略
    text
    Layer 0 (Root)
    ├── Layer 1 (Position: fixed)
    ├── Layer 2 (Opacity: 0.5)
    └── Layer 3 (3D Transform)
  • 绘制顺序
    1. 背景颜色
    2. 背景图片
    3. 边框
    4. 子元素
    5. 轮廓

3. 性能优化要点

  1. 减少 Reflow

    • 批量 DOM 操作
    • 使用 requestAnimationFrame
    • 避免频繁读取布局属性(如 offsetTop)
  2. GPU 加速

    css
    .optimized {
      transform: translateZ(0); /* 触发硬件加速 */
      will-change: transform;    /* 预先声明变化 */
    }
  3. 关键渲染路径优化

    text
    HTML 解析 → 关键 CSS 加载 → 首屏内容渲染 → 非关键资源加载

4. 现代渲染改进

  • 增量渲染:Chrome 的 Blink 引擎支持部分树更新
  • 光栅化线程化:将绘制任务分配到多个 CPU 核心
  • Jank 预测:通过历史帧时间预测卡顿风险

该流程的时间复杂度可近似表示为:

Trender=O(DOMnodes)+O(CSSrules)+O(Layoutcomplexity)\rm T_{render} = O(DOM_{nodes}) + O(CSS_{rules}) + O(Layout_{complexity})