有哪些减少重排和重绘的技术?
主题
浏览器JavaScript性能
在GitHub上编辑
TL;DR
要减少重排和重绘,您可以尽量减少 DOM 操作、批量处理 DOM 更改、使用 CSS 类进行样式更改、避免复杂的 CSS 选择器,并使用 requestAnimationFrame
进行动画。此外,请考虑对将经常更改的元素使用 will-change
,并通过分别读取和写入 DOM 来避免布局颠簸。
减少重排和重绘的技术
尽量减少 DOM 操作
频繁更改 DOM 可能会导致多次重排和重绘。要尽量减少这种情况:
- 使用
documentFragment
批量更新 DOM - 克隆节点,进行更改,然后替换原始节点
批量处理 DOM 更改
将多个 DOM 更改组合在一起可以减少重排和重绘的次数:
- 使用
innerHTML
一次更新多个元素 - 使用
requestAnimationFrame
批量更新
使用 CSS 类进行样式更改
不要通过 JavaScript 直接更改样式,而是使用 CSS 类:
const element = document.createElement('h1');element.classList.add('text-center');console.log(element); // Notice that the class has been added.
避免复杂的 CSS 选择器
复杂的选择器会减慢渲染过程:
- 使用简单直接的选择器
- 避免深度嵌套
使用 requestAnimationFrame
进行动画
使用 requestAnimationFrame
可确保动画与浏览器的重绘周期同步:
function animate() {// Animation logicrequestAnimationFrame(animate);}requestAnimationFrame(animate);
对频繁更改的元素使用 will-change
will-change
属性可以向浏览器提示哪些元素将要更改,从而允许它优化渲染:
.element {will-change: transform;}
避免布局震荡
分别读取和写入 DOM 可以防止布局震荡:
// Mock div elementconst element = document.createElement('div');const height = element.offsetHeight; // Readelement.style.height = `${height + 10}px`; // Writeconsole.log(element);