CSS 动画

CSS 动画 API 详解

动画属性

animation 由以下属性构成:

  • animation-name 名称
  • animation-delay 延迟
  • animation-duration 持续时间
  • animation-timing-function 缓动函数
  • animation-iteration-count 执行次数
  • animation-direction 动画是否反向播放
  • animation-fill-mode 设置CSS动画在执行之前和之后如何将样式应用于其目标
  • animation-play-state 控制动画的运行或暂停

动画阶段

动画的阶段分为:初始状态、等待期、动画执行期、完成期

初始状态:就是没有触发动画效果时,元素原有的状态(即不含 animation 的属性)

等待期:从触发动画开始到 animation-delay 计时结束的这段时间

动画执行期:在 delay 时间结束的瞬间开始执行动画,一直持续要最后一帧

完成期:执行完最后一帧时,元素处于的状态

动画缓动函数

常见函数:ease、ease-in、ease-out、ease-in-out、linear、step-start、step-end

step-start 、step-end

step-start:动画立即跳转至最终状态

step-end:动画在结束时跳转至最终状态

现在假设一个方块的动画如下:

@keyframes move {
    0% { left: 0; }
    100% { left: 100px; }
}

动画持续时长为 10s,当设置缓动函数为 step-start 时,方块会立即移动到 100px 处,当设置缓动函数为 step-end 时,方块会在动画结束时移动到 100px 处,在开始到结束的过程中,都不会产生位移。

steps

step 逐步运动,像是将丝滑的动画进行逐帧播放,其语法为:steps(number , position)

通过 number 参数讲一个运动过程平均拆分为多段,

position 通过 start 或 end 值,来控制在每一段的开始还是时触发动画

当 position 的值为 start 时,是在每一段的结尾部分触发动画

当 position 的值为 end 时,是在每一段的开始部分触发动画

steps 实现 GIF 逐帧动画,假如我们有如下一张12帧的 GIF 静态图

39

在不使用 steps 的时候,查看效果

如果适用 steps 来进行逐帧播放,那么效果就是符合预期的,查看效果

cubic-bezier 贝塞尔函数

cubic-bezier 函数定义了一个贝塞尔曲线

贝塞尔曲线曲线由四个点 P0,P1,P2 和 P3 定义。P0 和 P3 是曲线的起点和终点。P0是(0,0)并且表示初始时间和初始状态,P3是(1,1)并且表示最终时间和最终状态。

我们需要关注的是 P1 和 P2 两点的取值,而其中 X 轴的取值范围是 0 到 1,当取值超出范围时 cubic-bezier 将失效;Y 轴的取值没有规定,当然也毋须过大。

最直接的理解是,将以一条直线放在范围只有 1 的坐标轴中,并从中间拿出两个点来拉扯(X 轴的取值区间是 [0, 1],Y 轴任意),最后形成的曲线就是动画的速度曲线。

可以通过可视化工具生成贝塞尔函数

direction 反向播放

animation-direction 有以下属性:

  • normal:动画从头开始播放
  • reverse:动画从最后一个关键帧开始,在第一个关键帧结束,normal 和 reverse 都相当于单向播放
  • alternate:动画从第一个关键帧开始,在最后一个关键帧结束,然后在最后一个关键帧开始,在第一个关键帧结束
  • alternate-reverse:与 alternate 相反,两者都相当于来回播放

将上面的 GIF 动图的 animation-direction 设置为 alternate,此时动图就不是从头开始重播了,查看效果

fill-mode

fill-mode 设置CSS动画在执行之前和之后如何将样式应用于其目标,影响的是动画的等待期和完成期的状态

fill-mode 有四个值:

  • none:等待期和完成期的元素样式都是初始状态样式;

    下面假设有一个盒子,css 样式如下:

    .box{
        transform: translateY(0);
    }
    
    .box.on{
        animation: move 1s;
    }
    
    @keyframes move{
        from{transform: translateY(-50px)}
        to  {transform: translateY(50px)}
    }
    

    fill-mode 为 none 时转换成的坐标轴图形:

  • both:等待期样式为第一帧的样式,完成期保持最后一帧的样式;

  • backwards:等待期样式为第一帧样式,完成期跳转为最初始的样式;

  • forwards:等待期保持最初始的样式,完成期保持最后一帧的样式;

iteration-count

iteration-count 用于定义动画在结束前运行的次数,次数的值可以是整数,也可以是小数(例如设置值为 1.5 时,动画会执行一遍,然后再次开始,执行到一半时,动画结束),也可以是无限循环的 infinite

play-state

play-state 用于控制动画的运行和暂停,当恢复一个暂停的动画时,是从暂停的位置开始,而不是从动画序列的起点开始

play-state 有三个值:

  • unset:不设置
  • running:正在运行
  • paused:动画暂停
作者

BiteByte

发布于

2020-10-27

更新于

2024-11-15

许可协议