CSS 属性:animation-direction

4,072 阅读3分钟

animation-direction 为动画指定播放方向,有 4 个可能取值:

  • normal(默认),正向播放动画;
  • reverse,反向播放动画;
  • alternate,动画来回播放(从正向开始);
  • alternate-reverse,动画来回播放(从反向开始)。

以下面的动画为例:

@keyframes move-smooth {
	to {
		transform: translateX(50px);
	}
}

正向播放动画(默认)

这个动画效果 move-smooth,是让应用元素向右平移 50px。比如:

.move {
	animation: 1s move-smooth;
}

<div class="move">这是一段移动文字</div>

div.move 会自动执行动画 move-smooth 1 次,周期 1 秒。动画效果:元素 div.move 花费 1 秒从 translate(0) 处 ease 到 translate(50px) 的地方,即从原处向右 ease 式的平移了 50px,1 秒到动画结束,元素立即回到初始位置。

这个动画属于正向播放的,因为当我们没有为 animation-direction 指定方向时,默认值是 normal。

反向播放动画

我们再来看看动画反向播放的情况,即 animation-direction 属性值取 reverse 的情况。我们简单修改下现有 CSS 样式声明 .move,添加一个 reverse:

.move {
	animation: 1s move-smooth reverse;
}

欸!发现 div.move 变为向左平移 50px 了,初始状态则是在 translate(50px) 处。整个运动过程是:从 translate(50px) 的地方花费 1 秒 ease 到了 translate(0) 的地方,然后动画结束!如此自然的运动效果,没有上面取值 normal 时,动画结束,元素突然回到初始状态的状况发生。

从中我们可以体会到,reverse 的作用就是让动画反向播放的。

来回播放动画

alternate 和 alternate-reverse 都是用来控制动画来回播放的,不同的是:

  • alternate 是从正向开始播放动画的;
  • alternate-reverse 是从反向开始播放动画的。

“来回播放”也意味着在使用 alternate 和 alternate-reverse 这两个值时,动画执行次数至少要 2 次,才能完整体现它们的作用效果。

我们先拿 alternate 下刀。

从正向开始

我们修改下 .move 样式成 alternate 的,动画运动次数给 2。

.move {
	animation: 1s move-smooth 2 alternate;
}

下面我们细细观察动画效果……

发生 2 次动画,第一次从 translate(0) 运动到 translate(50px);第二次从 translate(50px) 运动到 translate(0)。每次运动时间为 1 秒。

嗯,发现 alternate 有点 normal,reverse 的意思啊,normal,reverse normal,reverse…… 这样子,所以为了保证 alternate 这类动画运动的完整性,要保证运动次数都是偶数次(2、4、6……)。

从反向开始

我们修改下 .move 样式成 alternate-reverse 的,动画运动次数给 3。

.move {
	animation: 1s move-smooth 3 alternate-reverse;
}

下面我们细细观察动画效果……

发生 3 次动画,第一次从 translate(50px) 运动到 translate(0);第二次从 translate(0) 运动到 translate(50px);第三次从 translate(50px) 运动到 translate(0)。啊哈,第三次终于回到初始位置了!所以保证 alternate-reverse 这类动画运动的完整性,要保证运动次数都是奇数次(3、5、7……)。

这样看,alternate-reverse 就是 reverse,normal reverse,normal……的意思,为了保证运动结束元素处于初始状态,所以我们设定的动画数都是奇数次的,也就是最后一次动画都是 reverse 的。

(完)