一旦我开始制作动画,在Chrome上我会得到连锁反应。我的圈子变换放大了。在 Firefox 上,由于某种原因,完全相同的动画被忽略了。
$("#animate").click(function() {
$("#square").toggleClass("animate");
$("#fab").toggleClass("ripple");
});
@keyframes ripple {
from {
transform: scale(0)
}
to {
transform: scale(20)
}
}
#square {
position: relative;
width: 300px;
height: 300px;
overflow: hidden;
border: 1px solid red;
transition: background 0.1s linear 0.6s, transform 1s;
transform: rotate(0deg);
}
#fab {
position: absolute;
width: 56px;
height: 56px;
border-radius: 50%;
background: #4FB5AB;
top: 122px;
right: 0;
transform: scale(1);
transition: transform 1s;
}
.ripple {
animation: ripple 1s 0.5s;
transform: scale(20) !important;
/*Duration - delay */
transition: transform 0s 1s !important;
}
.animate {
transform: rotate(90deg) !important;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="square">
<div id="fab"></div>
</div>
<br />
<button id="animate">animate</button>
代码笔演示
在我开始解释你的代码问题之前,这里有一个警告 - 不要同时使用过渡和动画。它们通常最终会导致像这里面临的问题。
在元素上指定动画时,它将完全控制要设置动画的属性,除非存在具有!important
设置的规则。如果使用!important
设置,则该规则优先于动画。(但不幸的是,Chrome和Firefox似乎以不同的方式处理这种情况)。
根据 W3C 规范:
CSS 动画会影响计算的属性值。在执行动画期间,属性的计算值由动画控制。这将覆盖正常样式系统中指定的值。动画会覆盖所有正常规则,但会被 !important 规则覆盖。
强调是我的
在您的代码中,有两个问题,它们如下所示:
- 在选择器
.ripple
中,您将transition-duration
指定为0s
,这意味着根本没有转换,并且转换的变化是即时的。正如 W3C 规范中所解释的,Firefox 似乎(正确地)通过!important
设置(即选择器中的transform
和transition
)将控制权交给规则.ripple
因此它会在指定的1s
delay+ 之后立即转换状态更改。Chrome 让动画控制,从而产生您正在寻找的效果。 - Firefox 似乎比 Chrome 更快地对元素进行动画处理,因此虽然 1 秒的持续时间足以用于 Chrome 中的动画,但 FF 需要 2 秒才能更慢并显示效果。
+
- 您可以通过删除规则上的!important
设置来进一步验证这一点。删除!important
后,动画将获得控制权。
$("#animate").click(function() {
$("#square").toggleClass("animate");
$("#fab").toggleClass("ripple");
});
@keyframes ripple {
from {
transform: scale(0)
}
to {
transform: scale(20)
}
}
#square {
position: relative;
width: 300px;
height: 300px;
overflow: hidden;
border: 1px solid red;
transition: background 0.1s linear 0.6s, transform 1s;
transform: rotate(0deg);
}
#fab {
position: absolute;
width: 56px;
height: 56px;
border-radius: 50%;
background: #4FB5AB;
top: 122px;
right: 0;
transform: scale(1);
transition: transform 1s;
}
#fab.ripple {
animation: ripple 2s 1s;
transform: scale(20);
/*Duration - delay */
transition: transform 1s 1s;
}
#square.animate {
transform: rotate(90deg);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="square">
<div id="fab"></div>
</div>
<br />
<button id="animate">animate</button>
最后,除非是强制性的,否则请不要使用!important
。相反,只需使选择器更具体。在代码段中,我通过使用#id.class
格式使其更具体。