Glittering's blog Glittering's blog
Home
  • 学习手册

    • 《JavaScript教程》
    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)

Glitz Ma

前端开发工程师
Home
  • 学习手册

    • 《JavaScript教程》
    • 《TypeScript教程》
    • 《Git》
    • 《Vite》
    • 《Vue3》
    • 《React18》
    • 《CSS》
    • 《Tailwind CSS》
    • 《ES6 教程》
    • 《TypeScript 从零实现 axios》
  • 技术文档
  • 算法
  • 工作总结
  • 实用技巧
  • collect
About
  • Classification
  • Label
GitHub (opens new window)
  • 技术文档

  • 算法

  • 工作总结

    • 时区校正
    • 上传下载文件方式总结
    • web异常监控和分析
    • 前端优化指南
    • http缓存机制
    • 静态资源灰度发布
    • 浏览器原理及渲染机制
    • Chrome DevTools 渲染分析实战
      • 一、准备一个“必出效果”的 Demo
      • 二、打开 Performance 面板(核心工具)
      • 三、录制一次渲染过程
        • 1️⃣ 点击 Record(●)
        • 2️⃣ 点击页面里的 Move
        • 3️⃣ 等动画结束
        • 4️⃣ 点击 Stop(■)
      • 四、读懂 Performance 时间线(重点)
        • 1️⃣ 总览区域(顶部)
        • 2️⃣ Main 线程(最重要)
        • 🔥 关键知识点(非常重要)
        • 为什么 offsetWidth 会触发 Layout?
      • 五、验证:transform 是否真的没有回流?
        • 打开 Rendering 面板
        • 再点一次按钮
      • 六、对比实验(非常关键)
        • 你会看到:
      • 七、用 FPS Meter 看流畅度
      • 八、总结
    • Layout Thrashing(布局抖动)
    • Composite Layer(合成层)
    • 全局设置滚动条样式好吗?
    • 虚拟列表如何避免Layout和Paint
    • 前端安全知识
    • 安全(同源策略 / CSP / CORS)
    • 浏览器安全模型
    • 从chrome v8 讲安全
    • WebAssembly(Wasm)
    • XSS → JIT → 沙箱逃逸
    • 微前端总结
    • websocket聊天
    • axios 与 promise
    • react高级特性
    • react基础知识总结
    • vue2常见原理总结
    • vue2基础知识总结
    • webpack优化实践
    • webpack基础应用知识总结
    • 小程序笔记
    • 小程序工程模板设计
    • 地图标绘--射线法来计算点在多边形内
  • 实用技巧

  • 收藏夹

  • 技术
  • 工作总结
mamingjuan
2022-11-19
目录

Chrome DevTools 渲染分析实战

  • 目标:
  • 亲眼看到一次页面渲染经历了:JS → Layout → Paint → Composite

# 一、准备一个“必出效果”的 Demo

先建一个最简单的 HTML(本地打开即可):

<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8" />
  <title>Render Demo</title>
  <style>
    .box {
      width: 100px;
      height: 100px;
      background: red;
      margin: 20px;
      transition: transform 0.5s;
    }
  </style>
</head>
<body>
  <button id="btn">Move</button>
  <div class="box" id="box"></div>

  <script>
    const box = document.getElementById('box')
    document.getElementById('btn').onclick = () => {
      // 强制触发 layout
      console.log(box.offsetWidth)

      // 只触发 composite
      box.style.transform = 'translateX(200px)'
    }
  </script>
</body>
</html>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

这个例子故意包含:

  • 一次 强制回流
  • 一次 只走合成层的动画

# 二、打开 Performance 面板(核心工具)

  1. 打开页面

  2. F12 / Cmd + Option + I

  3. 切到 Performance

  4. 勾选:

    • ✅ Screenshots
    • ✅ Web Vitals(可选)

# 三、录制一次渲染过程

# 1️⃣ 点击 Record(●)

# 2️⃣ 点击页面里的 Move

# 3️⃣ 等动画结束

# 4️⃣ 点击 Stop(■)

你现在看到的是浏览器最真实的内部执行轨迹


# 四、读懂 Performance 时间线(重点)

# 1️⃣ 总览区域(顶部)

你会看到几条颜色条:

颜色 含义
🟨 黄色 JS 执行
🟪 紫色 Style / Layout
🟩 绿色 Paint
🟦 蓝色 Composite

📌 目标状态:动画阶段几乎只有 🟦


# 2️⃣ Main 线程(最重要)

展开 Main:

Task
 ├── Event: click
 │    ├── Function Call
 │    │    ├── offsetWidth   ← 强制回流
 │    │    ├── set style
 │    ├── Layout
 │    ├── Paint
 └── Composite Layers
1
2
3
4
5
6
7
8

你会清楚看到:

👉 读 offsetWidth → 浏览器被迫执行 Layout → 后续 transform 不再触发布局


# 🔥 关键知识点(非常重要)

# 为什么 offsetWidth 会触发 Layout?

因为浏览器内部是惰性计算布局的:

  • 改样式:先记账
  • 读布局信息:必须算一次

这就是 Layout Thrashing 的根源


# 五、验证:transform 是否真的没有回流?

# 打开 Rendering 面板

  1. DevTools → More tools → Rendering

  2. 勾选:

    • ✅ Paint flashing
    • ✅ Layer borders

# 再点一次按钮

你会看到:

  • 盒子 闪蓝色边框(合成层)
  • 没有绿色闪烁(没有重绘)

✔️ 证明只发生了 Composite


# 六、对比实验(非常关键)

把 JS 改成:

box.style.left = '200px'
1

并加:

.box {
  position: relative;
}
1
2
3

重新录制 Performance。

# 你会看到:

  • 每一帧都有:

    • Layout
    • Paint
  • FPS 明显下降

👉 这就是为什么动画要用 transform


# 七、用 FPS Meter 看流畅度

  1. Rendering 面板
  2. 勾选 FPS meter

对比:

  • left 动画:FPS 波动大
  • transform:稳定 60

# 八、总结

  • 一次完整的浏览器渲染流程是:
  • DOM 和 CSSOM 构建完成后生成 Render Tree,
  • 然后进行 Layout 计算几何信息,
  • 接着 Paint 绘制像素,
  • 最后由 GPU 进行 Composite 合成。
  • 在 DevTools 的 Performance 面板中,可以看到
  • JS、Layout、Paint、Composite 的执行时间,
  • 使用 transform 和 opacity 可以跳过 Layout 和 Paint,只走合成层,从而获得更好的性能。
上次更新: 2026/01/07, 09:20:46
浏览器原理及渲染机制
Layout Thrashing(布局抖动)

← 浏览器原理及渲染机制 Layout Thrashing(布局抖动)→

Copyright © 2015-2026 Glitz Ma
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式