让 CSS 动画更自然

Avatar of Brandon Gregory
Brandon Gregory

DigitalOcean 为您旅程的每个阶段提供云产品。 立即开始使用 200 美元的免费积分!

过去,设计师负责设计,而程序员负责编码。两者之间没有交叉,这就是 当时的情况。但随着 CSS 过渡动画 的出现,这些界限变得模糊。不再是设计师决定设计,程序员进行转录——设计师现在必须了解一些代码知识,程序员必须了解一些设计知识才能有效地合作。

例如,假设设计师要求开发人员让一个盒子弹跳。就这样——没有其他指示。如果没有一些交叉知识和共同的词汇,双方都会在这项沟通中迷失方向:开发人员没有足够的 information 来完全实现设计师的愿景,但设计师并不真正知道有哪些选项以及如何传达这些选项。使用最基本的解释,您可能会得到如下所示的结果:

查看 CodePen 上 Brandon Gregory (@pulpexploder) 的 弹跳盒子 1

并不令人兴奋。不过,公平地说,这确实符合给定的所有条件。然而,我们绝对可以做得比这更好。

首先要查看的是时序函数。在上面的示例中,我们使用的是线性时序函数,这意味着盒子始终以相同的速度移动。在某些情况下,这是可取的;但是,在现实世界中,运动通常不会以这种方式进行。

一个简单的解决方法是将时序函数更改为 ease。这使得每个动画的开始和结束比中间部分稍微慢一些,这使得某些动画看起来更加自然。以下是启用了缓动函数的盒子:

查看 CodePen 上 Brandon Gregory (@pulpexploder) 的 弹跳盒子 2

这算是一点改进,但还有很多工作要做。盒子看起来仍然很机械和僵硬,相同的动画在相同的时间范围内不断重复。在弹跳之间添加一个轻微的延迟,可以添加一些视觉对比,这看起来更加自然

查看 CodePen 上 Brandon Gregory (@pulpexploder) 的 弹跳盒子 3

现在,盒子看起来像是在跳跃,而不是简单地上下移动。跳跃之间有一点加速和减速,这模拟了活物在收到相同指令时的表现。尽管我们没有关于弹跳盒子的参考,但我们都知道跳跃生物的样子。因为我们知道自然界中会发生什么,通过模仿,动画看起来更加自然。但我们可以做更多的事情让这种加速感更具重量。

如果您观看卡通,您会注意到自然运动通常是夸张的,创造出现实生活的漫画。如果做得好的话,这会让动画看起来与现实世界一样自然,而且还增加了给动画注入一些魅力和个性的额外好处。

在此阶段,设计师和开发人员之间的协作至关重要,但许多设计师可能甚至没有意识到这些选项的存在。开发人员可能需要向设计师宣传这种可能性。

通过在盒子的比例上添加一些微妙的扭曲,我们可以为动画添加很多东西

查看 CodePen 上 Brandon Gregory (@pulpexploder) 的 弹跳盒子 4

现在,盒子有了个性。它感觉像是活的。有很多东西可以调整,但这已经比最初的指令有了很大的进步——而且进步很大!

我们将在这一步的基础上更进一步,在跳跃结束时添加一点反弹

查看 CodePen 上 Brandon Gregory (@pulpexploder) 的 弹跳盒子 5

第二次弹跳让它感觉更加生动,但还是感觉有些不对劲。与动画的其他部分相比,弹跳看起来很僵硬。我们需要像对加速那样添加另一部分扭曲

查看 CodePen 上 Brandon Gregory (@pulpexploder) 的 弹跳盒子 6

在结束时添加的这种微妙的扭曲让反弹看起来更加自然。总的来说,与第一个示例中的基本线性弹跳相比,这是一个巨大的进步。

这可能是我们想要的,但可以使用自定义 三次贝塞尔 曲线对运动速率进行进一步的调整

查看 CodePen 上 Brandon Gregory (@pulpexploder) 的 弹跳盒子 7

如果没有设计师和开发人员都了解基本的动画原理和控件,就无法实现这种级别的自定义。实际上,本文只是触及了这两个领域的表面。如果您是与设计师合作的网页设计师或网页开发人员,我强烈建议您阅读这两个领域的信息。

对于动画原理,奥利·约翰斯顿和弗兰克·托马斯合著的《生命的错觉:迪士尼动画》是关于如何让现实生活中的漫画看起来生动和真实的绝佳入门书。有了这种共同语言,设计师和开发人员之间的沟通和协作将变得更加容易。

对于 CSS 动画的技术控件和变体,可能性几乎是无限的。延迟和时序很容易调整。如前所述,如果您不喜欢开箱即用的 ease 时序函数,您可以使用 cubic-bezier() 创建自己的时序函数。您还可以调整想要让动画更接近或更远离现实的扭曲程度。重要的是,设计师和开发人员都在思考这些变体,而不是盲目地接受一切而不进行定制。共享的知识和协作可以将简单的动画转变为伟大的动画。

更多资源