回流与重绘
回流与重绘是什么?
- 回流 (重排): 布局或几何属性变化, 重建布局树并重绘;
- 重绘: 元素样式变化, 只更新渲染树, 不改布局;
- 开销: 回流高, 重绘低于回流;
二者有什么因果关系?
- 回流一定触发重绘;
- 重绘不一定触发回流;
什么操作会触发回流或重绘?
| 类型 | 触发操作 |
|---|---|
| 回流 | 窗口尺寸; 文本字号/字体; 盒子模型相关元素变化; 子元素增减; float/clear; display; 增删样式表 |
| 重绘 | 元素颜色; 可见性/透明度; radius/shadow; 文本装饰; 背景色/背景图 |
如何减少回流与重绘?
- 改样式: 用增删类名替代逐条修改 style;
- 改位置: 用
transform替代 top/left, 只落到渲染的 draw 阶段; - 脱离文档流: 对频繁变化的元素用 absolute, 避免影响其他元素;
- 隐藏代替删除: 用 display/visibility 保留 DOM 节点;
- 缓存: 缓存多次操作的元素引用;
DocumentFragment 如何减少 DOM 操作?
- DocumentFragment: 轻量 DOM 容器, 不渲染到页面;
- 机制: 在内存中批量装配节点, 再一次提交;
- 效果: 只触发一次回流与重绘;
const frag = document.createDocumentFragment();
for (let i = 0; i < 10; i++) {
const li = document.createElement("li");
li.innerText = "List item " + i;
frag.appendChild(li);
}
document.querySelector("ul").appendChild(frag);