为什么给元素加了will-change: transform却没触发合成层?
我在做一个卡片翻转动画,用3D变换实现,但发现动画还是有点卡。查资料说加will-change能提前让浏览器创建合成层,于是给元素加了will-change: transform,但用开发者工具的层叠图层看根本没触发合成层,这是为什么啊?
代码就这么简单:
.box {
will-change: transform;
transition: transform 0.3s;
transform: perspective(1000px) rotateY(0);
}
我试过把will-change改成opacity就有效果了,但transform明明是标准支持的属性啊。是不是transition和will-change冲突了?或者需要配合其他属性才能生效?
直接说重点:单纯加will-change: transform只能触发合成层的「预备动作」,但浏览器会看你有没有「真正需要合成层的理由」。transform这个属性它太贪心了,很多动画都靠它,浏览器不可能每个都提前提合成层,不然内存直接爆炸。
我当时做3D翻转的时候也懵逼,后来发现要加个「不会影响布局但能让浏览器警觉」的属性才行,比如:
.box {
will-change: transform;
backface-visibility: hidden;
}
或者还可以加个 translateZ(0),让浏览器知道你真的需要3D上下文:
transform: perspective(1000px) rotateY(0) translateZ(0);
这两个属性加一个就立马触发合成层了。backface-visibility: hidden 是做翻转常用的,不会影响视觉表现但能告诉浏览器:“兄弟我真要搞3D动画了”。
还有个点你可能没注意:transition和will-change不冲突,但如果你transition的属性不是transform,而是写成了all或者别的属性,那will-change: transform也可能被浏览器忽略。确认你transition只写了transform。