这篇文章总结得很精辟,核心思路就是避开布局属性改用合成属性,配合 DocumentFragment 进行批量操作。
具体来说,做动画时优先用 transform 和 opacity,这两个属性直接走 GPU 加速,不会引起页面重排,性能提升最明显。而 left、top 这种改变物理位置的属性,每次改动都会让浏览器重新计算布局,非常消耗性能。
针对批量 DOM 操作,确实要用 DocumentFragment 在内存中拼装好再一次性插入,这样能只触发一次重排。另外,配合 requestAnimationFrame 把操作安排在下一帧渲染前执行,能避免阻塞主线程,让动画更流畅。还有一个容易忽略的点,就是 will-change 属性,提前告诉浏览器元素要变,让浏览器提前分配图层,能进一步优化。
最后提醒一点,千万别在修改样式的瞬间去读取 offsetWidth 等布局属性,这会强制浏览器同步重排,导致前面的优化失效。