CSS关键帧动画由 @keyframes 创建一个自定义名称的动画序列,再由元素对应的选择器通过 animation 属性调用动画。
一、创建CSS关键帧动画创建CSS关键帧动画用 @keyframes 实现,语法结构:
@keyframes 名称 { 时间节点1 { CSS属性 } 时间节点2 { CSS属性 } 时间节点N { CSS属性 }}@keyframes 创建的动画序列以一系列关键帧描述动画形态,包含时间节点和动画数据。时间节点可以使用百分比或关键字 from 和 to 表示,动画数据则是任意支持关键帧动画的单个或多个CSS属性。试看:
/* 方法一 :百分比 */@keyframes move { 0% { left: 0px; top: 10px; } 100% { left: 240px; top: 180px; }}/* 方法二 :关键字 */@keyframes move { from { left: 0px; top: 10px; } to { left: 240px; top: 180px; }}上述两种关键帧动画的设计等价,但方法一更易于扩展:在0%~100% 之间可以加入任意多个时间节点用以描述更多的关键帧。方法二适用于简易动画,它只关心两个时间节点即 0% 和 100% 的动画状态。
很多时候元素用于关键帧动画的对应CSS属性已经设置了初始值,若此,关键帧动画开始的时间节点可以省略(特别是基于关键字方法):
/* 元素定义了 left和 top 初始值 */.ball { position: absolute; left: 0px; top: 10px; }/* keyframes 关键帧动画可以省略 from 关键字属性 */@keyframes move { to { left: 240px; top: 180px; }}对于追求简洁代码需求而言,这是有效的方法,但一切应根据具体情况而定。
二、运行CSS关键帧动画CSS关键帧动画由元素运行,通过元素对应CSS选择器的 animation 属性进行设置。animation 属性语法结构如下:
/* 红色参数必须,其余可选(缺省时使用默认值) */ animation: ①动画名称 ②周期时长 ③时间函数 ④延时时间 ⑤运行次数 ⑥运动方向 ⑦结束状态 ⑧播放状态/* 应用举例 :①move动画,②6秒一周期,③匀速,④延时0秒,⑤运行一次,⑥正向,⑦保留最后状态,⑧运行 */animation: move 6s linear 0s 1 normal forwards running;/* 因为 0s、normal、running 属性值都是默认值,可以简化为 */animation: move 6s linear 1 forwards;animation 是一个简写属性,它包含多个 animation-* 属性:
- animation-name :由 @keyframes 创建的动画名称,支持单个、多个
- animation-duration :动画周期时长,即完成一个动画周期所需的时间,时间单位
- animation-timing-function : 时间函数,即动画在每个周期的持续时间内如何进行,例如匀速、先快后慢、两头慢中间快或自定义运动时间曲线等等(文末附详细列表)
- animation-delay :动画延时时间,本质指动画执行之前等待的时间量,支持正(延后)负(提前)数,时间单位
- animation-iteration-count :动画运行次数,小于等于0表示不运行,infinite 表示永久运行
- animation-direction :运动方向,即播放动画的方向与 @keyframes 时间节点指向的关系,值有 normal(默认,正向)、reverse(反向)、alternate(往复)、alternate-reverse(反向往复)
- animation-fill-mode :动画结束时的状态,确切以言之,该属性设置 CSS 动画在执行之前和之后如何将样式应用于其目标。默认值是 none,可选值 forwards(保留最后帧状态)、backwards(首帧状态)
- animation-play-state :动画播放状态,设置动画播放(running)或暂停(paused)
属性较多,可以根据需要取舍,逐个设置时顺序不论:
.ball { /* ... 这里是其它代码 */ animation-name: move; animation-duration: 6s; animation-timing-function: linear; animation-iteration-count: 1; animation-fill-mode: forwards;}建议尽可能使用 animation 简写属性设置动画。
三、动画实例(一)元素平移运行代码<style> .rect { width: 40px; height: 40px; background: cyan; transform: translate(0,100px); /* 匀速、8秒一个周期、永动、往复(来、回各算一个周期) */ animation: move linear 8s infinite alternate; } /* 动画 :水平移动 */ @keyframes move { to { transform: translate(800px,100px); } }</style><div class="rect"></div>