CSS动画和转场的缓和函数 介绍及应用实例

34 阅读6分钟

你有没有注意到,在一个制作精良的专业项目上,动画看起来是多么流畅和令人愉快?我想起了In Pieces网站,那里的动画不仅仅是用于装饰,而且还以一种有冲击力的方式传达了关于濒危物种的信息。动画的设计和风格不仅漂亮,而且还很流畅,很和谐。恰恰是这种与设计和表现形式相结合的流动,使动画看起来令人惊叹和自然。这就是缓和函数的力量,它也被称为计时函数。

动画持续时间决定了动画从第一个关键帧到最后一个关键帧所需的时间。下图显示了动画关键帧和持续时间之间的联系。

动画在两个关键帧之间的进展有很多方式。例如,动画可以有一个恒定的速度,或者它可以在开始时快速移动,在接近结束时放慢速度,或者在开始时缓慢移动,然后加速,直到到达结束,等等。这种速率,或者说速度是用**缓和函数(计时函数)**定义的。如果我们看一下前面的图,缓和函数由连接两点的线的形状表示。我们在前面的例子中使用了线性函数(直线),但我们也可以使用曲线来连接关键帧。

正如你所看到的,动画缓和函数有很多可能的选择和变化,我们接下来会看一下。

缓和函数的类型

在CSS中主要有三种类型的缓和函数可以使用:

  • 线性函数(linear )。
  • 立体贝塞尔函数(包括ease,ease-in,ease-outease-in-out )。
  • 阶梯函数 (steps)。

线性函数

我们在前面的一个例子中已经介绍了线性函数,所以让我们做一个简单的回顾。通过线性定时函数,动画以恒定的速度通过关键帧。你可能已经知道,线性计时函数可以通过使用linear 关键字在CSS中轻松设置。

这是因为第一个点(P0)和最后一个点(P3)被固定在曲线的起点(初始动画状态)和终点(最终动画状态),因为动画需要在指定的关键帧和指定的时间内结束。通过剩下的两个点(P1和P2),我们可以对函数的曲线和缓和度进行微调,从而获得非线性的动画速度。

cubic-bezier(x1, y1, x2, y2)

X坐标(x1x2)代表时间比例,并被限制在0和1之间的数值(动画不能比指定的时间更早开始或持续更久),而Y坐标(y1y2)代表动画输出及其数值,通常设置在0和1之间,但不限制在这个范围。我们可以使用0和1范围之外的y1y2 的值来创造弹跳效果。

如果动画由几个关键帧组成,在CSS@keyframes 属性中定义,缓和函数将被应用于两点之间的每条曲线。如果我们对一个有3个关键帧的动画应用ease-out 函数,动画将在第一个关键帧开始时加速,并在第二个关键帧附近减速,同样的动作将在下一对关键帧(第二个关键帧和最后一个关键帧)重复。

下面的例子展示了各种跳跃条件是如何影响动画行为的。各种跳转条件被应用于具有相同持续时间的5步动画。

ChromeSafariFirefox还在开发者工具中提供了一个专门的动画选项卡,提供了更详细的概述,包括动画属性、持续时间、时间线、关键帧、延迟等。

有用的工具和网站

有很多有用的在线资源和缓和预设,可以为缓和功能提供更多种类。

比较流行的在线资源包括Andrey Sitnik和Ivan Solovev的Easing Functions Cheat Sheet和Matthew Lein的CSS Easing Animation Tool。这些工具提供了广泛的预设,你可以将其作为缓和功能的基础,然后对曲线进行微调以适应你的动画时间线。

动画与可及性

在使用缓和函数和一般的动画时,解决无障碍要求是很重要的。有些人喜欢在减少动作的情况下浏览网页,所以我们应该提供一个适当的退步。这可以通过广泛支持的prefers-reduced-motion媒体查询来轻松实现。这个媒体查询允许我们删除动画或根据用户的偏好指定一个不同的动画。

.animated-element {
  animation: /* Regular animation */;
}

@media (prefers-reduced-motion) {
  .animated-element {
    /* Accessible animation with reduced motion */
  }
}

我修改了Alvaro Montoro的一个模拟时钟的例子,为设置了prefers-reduced-motion 标志的用户提供了替代动画。

请看Adrian Bece的PenCSS Analog Clock,它喜欢减少运动

在默认的动画中,时钟的秒针是不断移动的,这可能会给一些用户带来困难。我们可以通过将动画的计时功能改为steps ,轻松地使动画更容易被接受。在下面的例子中,设置了prefers-reduced-motion 标志的用户将显示一个秒针每五秒跳动一次的动画。

@media (prefers-reduced-motion) {
  .arm.second {
    animation-timing-function: steps(12);
  }
}

结论

缓和函数,或称计时函数,通过影响动画速率(速度)来改变动画的外观和感觉。缓和函数使我们能够创建类似于自然运动的动画,这可以使用户体验得到改善,更令人愉快,给用户留下更好的印象。我们已经看到我们如何使用预定义的值,如linear,ease-out,ease 等来快速添加一个计时功能,以及如何用cubic-bezier 功能创建自定义的缓和功能,以获得更令人印象深刻和有影响力的动画。我们还介绍了可用于创建 "滴答 "动画的楼梯函数,这些函数很少被使用。当创建动画时,重要的是要记住无障碍性,并为设置了prefers-reduced-motion 标志的用户提供一个替代性的、动作较少的动画。

有很多浏览器和在线工具可以简化和精简创建自定义缓和功能,因此创建具有漂亮流程的动画比以往任何时候都更容易。如果你还没有这样做,我建议你尝试使用各种缓和函数,并创建你自己的缓和函数库。