css动画之animation

755 阅读5分钟

这是我参与11月更文挑战的第2天,活动详情查看:2021最后一次更文挑战

前言

animation 属性在实现 css 动画中发挥重要的作用,理解 animation 各项属性的使用,以及在创建动画的过程中发挥的作用,能够帮助我们更好的实现想要的动画效果。

@keyframes

关键帧,结合 animation 使用,负责控制 css 动画中的关键画面animation 只是设置动画的规则)。在传统的动画设计要素中称为关键动作,即在场景变化的间隔时间内,绘制关键图片。

@keyframes 内按动画时间的百分比划分为0%-100%,可以在任意一个时间点插入关键画面。每一组关键画面,会赋予一个特定的名称。

@keyframes animationName {
    0%{
       ... 
    }
    50% {
       ...
    }
    100%{
       ...
    }
}

@keyframes 遵循以下规则:

  • 未指定起始和终止状态(即0%和100%)时,将使用元素的原始状态作为开始和结束的动画状态。
  • 关键帧中使用非动画属性,该属性会被忽略,其他属性仍然生效。
  • 关键帧不存在样式层叠,同名 @keyframes 以最后一个生效,同名百分比,以最后一个生效。
  • 关键帧内使用 !important 无效。

animation

使用 animation 创建动画,需要结合 @keyframes 使用,同时 animation 也包含多个属性:animation-nameanimation-durationanimation-timing-functionanimation-delayanimation-iteration-countanimation-directionanimation-fill-modeanimation-play-state,通过给这些属性设置不同的值可以产生多样的动画效果。

animation-name

该属性指定应用的一系列动画,每个名称代表一个由 @keyframes 定义的一组关键画面。

animation-duration

表示一个动画周期的时长,值为带时间单位的数值,该值控制一系列动画的持续时间,持续时间越短,整个动画的变化速度就越快。

animation-timing-function

定义动画在每一周期的执行节奏。

timing-function 表示一个数学函数,描述了一个动画中一维数值的改变速度,主要有:

  • cubic-bezier():三次贝塞尔曲线。
  • steps():阶梯函数

cubic-bezier

三次贝塞尔曲线

该曲线有四个关键点,p0,p1始终表示为(0,0),(1,1),那么曲线的平滑程度将由 p1,p2共同控制;(p1控制前半段,p2控制后半段);如果以p0,p1表示动画的起点终点,则曲线的变化就表示动画的变化节奏;

css 中通过设置P1(x1,y1),P2(x2,y2)进行控制;其中X1,X2必须满足区间[0,1](超过则无效),Y1,Y2不在[0,1]区间,会产生反向运动的效果;

animation-timing-function: cubic-bezier(x1, y1, x2, y2);
<!--动画表现为开始快,中间慢,结束快-->
animation-timing-function:cubic-bezier(0.1, 0.7, 1, 0.1);

css 中提供了一些由 cubic-bezier()曲线函数演化而来的timing-function关键字:

  • linear:表示 cubic-bezier(0.0, 0.0, 1.0, 1.0)。使用这个定时函数,动画会以恒定的速度从初始状态过渡到结束状态。

linear

  • ease:此关键字表示 cubic-bezier(0.25, 0.1, 0.25, 1.0)。动画开始缓慢,中间加速,结束缓慢。

  • ease-in:cubic-bezier(0.42, 0.0, 1.0, 1.0)。动画开始时缓慢,然后逐步加速,最后保持一定的速度直到动画停止。

  • ease-out:此关键字表示 cubic-bezier(0.0, 0.0, 0.58, 1.0)。动画开始很快,然后逐渐减慢。

  • ease-in-out:此关键字表示 cubic-bezier(0.42, 0.0, 0.58, 1.0)。使用这个定时函数,动画开始的行为类似于 ease-in 函数,动画结束时的行为类似于 ease-out函数,即先慢后快再慢。

steps

阶梯函数,定义了一个等距步长的阶梯函数。

csssteps()函数包含两个参数,第一个为阶梯数,第二个参数为函数的方向 start|end;

  • start: 表示开始时进行一次阶跃
  • end:表示结束时进行一次阶跃
animation-timing-function: steps(2,end);
animation-timing-function: steps(4,start)

steps()函数演化的关键字有:

  • step-start:此关键字表示 steps(1, start)。使用这个定时函数,动画会立刻跳转到结束状态,并一直停留在结束状态直到动画结束。

  • step-end:此关键字表示定时函数 steps(1, end)。使用这个定时函数,动画会一直保持初始状态直到动画结束,然后立刻跳转到结束状态。

animation-delay

表示动画延迟多久后开始执行,时间单位的数值,默认为0s

animation-iteration-count

表示动画执行的周期次数:

  • infinite:无限次数
  • 数字:表示周期数,可以为小数,例如1.5,表示一个半周期;
animation-iteration-count: infinite;
animation-iteration-count: 1.5;

animation-direction

表示动画播放的方向,即是否反向播放;

  • normal:默认值,每个动画周期都从起点开始
  • reverse:每个动画周期都从终点开始
  • alternate:动画周期交替运行,反向运行时,动画按步后退,同时,带时间功能的函数也反向,比如,ease-in 在反向时成为 ease-out
  • alternate-reverse:交替运行,由反向开始;

animation-fill-mode

设置动画开始之前和结束之后的样式状态;

  • none:默认值,在开始之前,结束之后都不应用动画样式。
  • forwords:动画结束后,元素保持最后一帧的动画状态。
  • backwords:动画开始之前,元素应用第一帧动画的状态(开始之前,表示动画未开始前的一段时间,例如animation-delay的延迟时间内)。
  • both:即同时应用 forwordsbackwords。动画开始之前,元素应用第一帧,结束之后,应用最后一帧。

如果 timing-functionsteps(1,end)fill-mode 设置了 forwords 才可以看出效果(结合steps函数便可以理解)。

animation-paly-state

定义一个动画是运行状态还是暂停状态,

  • running:动画正在运行。
  • paused:动画暂停中。

这个属性有两个用处:

  1. 通过查询 animation-paly-state 值,可以判断动画在运行还是暂停状态。
  2. 通过改变 animation-paly-state 的值,可以改变当前动画的状态。

animation 相关的事件

animation 设置的动画相关的事件有:

  • animationstart
  • animationend
  • animationend

通过监听这些事件,可以获取到与动画执行相关的信息。