术语:回流和重绘

领域:#前端/渲染性能

定义

术语定义
回流 (Reflow)浏览器重新计算元素几何属性(尺寸、位置),可能影响整个页面布局
重绘 (Repaint)浏览器仅重新绘制元素外观(颜色、阴影),不改变布局
渲染过程:
解析 HTML/CSS 渲染树 布局(Layout/回流)  绘制(Paint/重绘)  合成(Compositing)

浏览器渲染管线

flowchart LR
    A[解析 HTML] --> B[CSSOM]
    A --> C[DOM]
    B --> D[渲染树]
    C --> D
    D --> E[布局 Layout<br/>回流 Reflow]
    E --> F[绘制 Paint<br/>重绘 Repaint]
    F --> G[合成 Compositing]
    G --> H[屏幕]

何时触发

触发回流仅触发重绘
元素尺寸变化(width、height)颜色变化(color、background-color)
位置变化(margin、padding)可见性(visibility、outline)
字体变化(font-size)阴影变化(box-shadow)
添加/删除元素透明度变化(opacity)
浏览器窗口 resize

性能影响

  • 回流代价高:可能影响整个页面布局,计算量大
  • 重绘代价较低:仅影响元素外观,但仍阻塞主线程
  • 最坏情况:连续多次回流/重绘导致掉帧、卡顿

优化策略

策略方法
属性选择优先使用 transformopacity(仅触发合成,不触发回流/重绘)
批量操作使用 DocumentFragment 批量添加 DOM
读写分离先读所有布局属性,再写修改(避免强制同步回流)
CSS 类批量修改一次性切换 class,而非逐个修改 style
display: none隐藏元素后修改,再显示(避免中间触发)
will-change提示浏览器提前创建合成层

与合成层的关系

回流/重绘 主线程执行 可能阻塞

使用 transform/opacity 跳过回流/重绘 仅触发合成 合成线程执行 不阻塞主线程
  • transformopacity 的变化不会触发回流或重绘
  • 浏览器为这些属性创建独立合成层
  • 合成在 compositor thread 执行,不阻塞主线程

详见:合成层

知识网络

参考资料