最有效提升帧率的方式是仅用transform和opacity做动画以避开layout计算。需合并transform写法、慎用will-change、严格分离读写操作、用translateZ(0)提升图层、批量DOM更新使用DocumentFragment。
直接用 transform 和 opacity 做动画,避开 layout 计算,是提升帧率最有效的方式。大屏掉帧、滚动卡顿、动画不跟手,根源往往不是硬件差,而是每帧都在强制重排。
浏览器对某些 CSS 属性的修改可跳过 Layout(重排)和 Paint(重绘),直接交由 GPU 合成层处理。这类属性包括:
translateX(10px)、scale(1.2)、rotate(45deg);注意合并写法,比如用 translate(10px, 5px) 而非两行 translateX + translateY
will-change:它可能提前创建图层,但 Safari 支持弱,且易误触发;更稳妥的是 transform: translateZ(0)
在 requestAnimationFrame 中混用布局读取(如 offsetTop、getBoundingClientRect())和样式写入(如 el.style.transform = ...),会迫使浏览器同步 flush 渲染队列,每帧都重排。
clientWidth、getComputedStyle() 等触发 layout 的 API仅加 transform 不等于隔离——元素仍在文档流中,父容器仍需为它计算行高、预留空间。要实现真正“视觉隔离”,需图层提升:
transform: translateZ(0),比逐个子项提升更省内存margin-top 对齐),改用 position: absolute 或 flex/grid 重新组织插入或修改大量节点时,每次操作都可能引发重排。应避免:
appendChild 50 次innerHTML
display: none 隐藏→操作→再显示,虽减少重排次数,但隐藏/显示本身各触发一次,不如 DocumentFragment 一次性注入推荐做法:用 document.createDocumentFragment() 在内存中构建完整结构,最后单次挂载到真实 DOM。