异步转场动画需精准触发合成:用translate3d(0,0,0)、opacity:0.99、动态设置will-change及blur(0.1px)升层,避开top/left/box-shadow等降级属性,并禁用JS读取布局或修改非合成属性,配合contain:strict和@keyframes保障高帧率。
要让异步转场动画真正跑在独立 GPU 图层上,关键不是“加层”,而是精准触发合成、守住合成、避免降级。浏览器不会因为你写了 transform 就自动升层,必须用明确、稳定、时机得当的手段。
只依赖已被实测跨浏览器(Chrome / Safari / Edge,含 iOS)验证的属性组合:
translateZ(0) 更可靠,尤其在 iOS Safari 上升层成功率更高el.style.willChange = '';长期挂着会持续占用显存blur(0) 更保险,零值滤镜部分浏览器会跳过升层逻辑以下写法看似相关,实则会破坏或阻止合成层生成:
即使 CSS 已成功升层,JS 仍可能在 requestAnimationFrame 循环中把它拖回主线程:
el.offsetTop、el.getBoundingClientRect()、getComputedStyle(el).height——触发同步 layout,整帧卡住el.style.left = '100px',或通过 class 切换引入 left 等布局属性——强制降级到 paint 阶段升层只是起点,还需配合渲染策略才能稳定输出高帧率:
contain: strict,隔离样式与布局影响,减少重排范围CSS @keyframes + animation 替代 JS 手动更新样式,更易被浏览器识别为可合成动画