为什么我的CSS过渡动画在首次悬停时没有触发?
大家好,我在给按钮加背景色过渡动画时遇到奇怪的问题。当第一次鼠标悬停时颜色会突然跳变,但第二次悬停才会正常平滑过渡。我明明设置了transition属性,这是怎么回事啊?
代码是这样的:transition: background-color 0.3s ease;,然后在:hover里改了background-color。测试了Chrome和Firefox都有这个问题。我尝试过把transition写在:hover里,或者加!important都不行…
.button {
background-color: #4CAF50;
transition: background-color 0.3s ease;
}
.button:hover {
background-color: #45a049;
}
最离谱的是transform属性的过渡完全正常,就是颜色相关的属性有问题。是不是有什么隐藏的初始状态没设置?求大神指点!
改一下就行,代码如下:
加了
will-change后,浏览器会提前准备好过渡动画,首次悬停就不会跳变了。这个属性就是告诉浏览器哪个属性可能会变化,让它优化渲染。如果你不想用
will-change,也可以试试强制触发重绘的小技巧:transform: translateZ(0)会让元素进入硬件加速,效果类似,不过我个人更推荐第一种方法,语义更清晰。这两种方式都试过,很靠谱,选一个你喜欢的用就行。
你只在正常状态加了transition,但浏览器首次渲染时可能不会为颜色属性建立过渡上下文。解决办法是在:hover状态也重复声明一次transition属性。
改一下你的代码:
.button {
background-color: #4CAF50;
transition: background-color 0.3s ease;
}
.button:hover {
background-color: #45a049;
transition: background-color 0.3s ease;
}
这样首次hover时就能正常触发颜色过渡动画了。虽然看起来有点重复,但这是目前兼容性最好的做法。性能上不会有影响,浏览器对这种声明优化得很好。
transform正常的本质是因为硬件加速上下文提前建立了,颜色属性没有这个待遇。所以得靠手动重复声明来强制建立过渡上下文。