面试题库 词条目录
前端Wiki/词条/重绘与回流

重绘与回流

定义回流:几何位置变化重新计算布局;重绘:外观变化重新绘制像素;重排=回流

渲染树 → 布局 → 绘制 → 合成,这是渲染流水线的后三段。改变元素的几何(width/height/margin/位置/窗口 resize)触发回流(reflow,又叫重排):整棵渲染树要重新计算位置与尺寸。只改变外观(color/background/visibility)触发重绘(repaint):布局不变,只需重新绘制像素。回流必然重绘,重绘不一定回流。

性能上回流贵得多(可能波及整树),优化手段:① 减少直接读写布局属性(offsetWidth 读一次触发一次回流);② 改样式用 class 批量操作而不是逐条 style;③ 脱离文档流(absolute/fixed)使回流范围缩小到自身;④ transform/opacity 交给合成层(GPU,不触发回流/重绘)——这是现代动画的性能基石。

HTML
<div id="box">动</div>
<style>
  #box {
    /* ✓ 用 transform 做位移动画:不触碰布局 → 不回流 */
    transition: transform .2s;
    will-change: transform;     /* 提示提升到合成层 */
  }
  #box.move { transform: translateX(100px); }
</style>
<script>
  const box = document.getElementById('box');

  // ✗ 逐条改 style:每写一次都可能触发一次回流
  box.style.left = '100px';
  box.style.top  = '50px';

  // ✗ 强制同步布局:读布局 + 写布局交替 = 每帧都回流
  for (let i = 0; i < 100; i++) {
    box.style.width = box.offsetWidth + 1 + 'px';  // 读→写→读→写…
  }

  // ✓ 批量写:写完再读(读写分离)
  box.style.cssText = 'left:100px; top:50px;';
  const w = box.offsetWidth;      // 只触发一次回流
</script>
⚠ 常见误区
🔗 相关词条从 URL 输入到页面渲染虚拟 DOM 与 Diff浏览器存储
← 返回来源章节重绘回流与性能优化