使用animation-timing-function
在你的关键帧中,让两个过渡(上升后跟随下降)成为抛物线。
要正确地完成这个任务(即根据物理学),你需要首先确保“顶点”点的比例和时间相应正确。你的动画从0%到100%运行,而拱形的顶点(最大比例点)位于两者之间,我们称其为m%。比例从0(在0%处)开始,以1(在100%处)结束,并在m%处达到峰值,假设为s。然后使用一些基本数学知识,这两个变量之间的关系是:
m = 100 / (1 + sqrt(s-1))
或者
s = (100/m - 1)^2 + 1
要使峰值达到80%,您需要s= 17/16 = 1.0625。
或者,对于最大比例为s的情况,您需要将峰值提高至m = 69.0983 ...%。
现在,为了使过渡合理地呈抛物线形状,您需要使用抛物线animation-timing-function
设置。当对象上升时,您想要有效地使用类似于ease-out
的东西,当它开始下降时,您想要使用类似于ease-in
的东西......但是与这两个关键字相关的三次贝塞尔曲线不完全是抛物线。
相反,请使用:
animation-timing-function: cubic-bezier(0.33333, 0.66667, 0.66667, 1)
为了动画中的“升起”部分:
animation-timing-function: cubic-bezier(0.33333, 0, 0.66667, 0.33333)
对于“fall”部分,这些曲线确实给出了精确的抛物线。(有关这些值的推导的数学细节,请参见此处;请注意,理想情况下,您应该使用1/3而不是0.33333和2/3而不是0.66667,但CSS不允许使用分数)。
将所有这些组合在一起,就可以得到以下CSS:
将所有这些组合在一起,就可以得到以下CSS:
.someElement { animation: springIn 1s linear 1s 1 none }
@keyframes springIn
{
0% { transform: scale(0.0); animation-timing-function: cubic-bezier(0.33333, 0.66667, 0.66667, 1) }
69.0983% { transform: scale(1.2); animation-timing-function: cubic-bezier(0.33333, 0, 0.66667, 0.33333) }
100% { transform: scale(1.0) }
}
...如果我的计算是正确的,那应该会给你一个完美的抛物线动画轨迹!
(注意:我将animation-fill-mode更改为“none”,因为在动画结束后继续强制执行transform: scale(1.0)
似乎并不必要。如果出于某种原因实际上需要,请将此值更改回“forwards”)。
ease-out
不是应用于整个动画吗?我希望它在达到顶点时缓出,然后从顶点开始缓入下降。 - Pwner