Animations in action

前面我们讲了 transition 属性,现在让我们来学习下 animation 属性

Animations in action - 图1

A symbiotic relationship

给元素添加 animation 跟添加 transition类似。不过它还需要 keyframes

  1. .element {
  2. animation: ...
  3. }
  4. @keyframes animation-name {
  5. /* Keyframes go here */
  6. }

单独定义 keyframes 的好处是我们可以复用这些动画。

The animation property

我们通过 animation 属性可以将编写的 keyframes 应用到元素上。animationtransition 很类似,不过多了一些其他的选项。下面是 animation 的简写方式:

  1. animation: change-background 4s linear infinite;

分开写就是下面这样:

  1. animation-name: change-background;
  2. animation-duration: 4s;
  3. animation-timing-function: linear;
  4. animation-repeat: infinite;

transition 需要指定一个目标属性,例如 “background” 或 “all”,animation 则需要带 keyframes 的名字来描述动画。

animation 拥有一些 transition 没有的属性。例如,我们可以告诉动画来回交替循环,而不是每次从头开始循环。

Keyframes

keyframes 是用来描述动画过程中一系列变化的。

我们用一个简单的例子来说明下:在网页上有一个 div 标签,它的背景颜色不断地在变,像下面图中显示的那样。

Animations in action - 图2

怎样描述这种变化呢?我们可以说“开始时蓝色,到一半时变成橙色,最后变成绿色”

如果再精确一点描述,我们可以用百分比来描述:

“0%的时候蓝色背景,50%的时候橙色,100%的时候绿色”

我们可以概括为:

  1. 0% Blue
  2. 50% Green
  3. 100% Orange

这样子我们就创建了动画整个过程中包含的“路径点”(waypoint)。 现在要做的就是将这些百分比按照 keyframes 的规则去写并命名。 结果如下:

  1. @keyframes change-background {
  2. 0% {
  3. background: blue;
  4. }
  5. 50% {
  6. background: orange;
  7. }
  8. 100% {
  9. background: green;
  10. }
  11. }

这个动画名字叫 “change-background”。稍后我们会用到它。

结合下面的例子,我们可以看出,上面的百分比指的是在动画过程中,其对应的 keyframe 发生的“时间点”。还可以知道,我们只要告诉浏览器开始、中间和结束时的颜色就可以了,在这些状态之间变化时,浏览器会自动去计算颜色值的插值。

Source: http://codepen.io/donovanh/pen/WbqNwd?editors=110

CodePen 链接

前面提到过,使用 animation-direction 可以让动画来回交替变化,看下面的例子,直观地感受下:

Animations in action - 图4

代码放到CodePen上了。 animation-direction 属性已经更改为 alternate

Prefixes

虽然我写的代码里没有加 -webkit- 等前缀,但如果要在实际工程里应用 animation,还是要添加对应的浏览器前缀。

在 CodePen 中,你可以使用 CSS 设置中的 “Autoprefixer” 选项。对于本地开发,我使用 Gulp 版本的 Autoprefixer。 Prefix Free也是一个不错的选择。

Homework

Open up this keyframes example and try changing the code. See if you can break it, and fix it. Even better, if you come up with something cool, let me know!

I love seeing how you’re getting on. You can email me or get in touch on Twitter.