细说css3的动画(1)animation属性
用程序做过动画的同学再看下面的这篇讲解,或许会非常熟悉(不同程序写动画语法可能稍微不太一样,但很多的思想和原理都是相同的)。
1、再介绍css3动画前,先普及一下一些动画相关的概念:
帧(frame):通过去的胶片电影一样,几十张图连起来放就是动画,一张图就是一帧,人眼识别的极限大概是24帧/秒(看不出间断)。而即便是黑科技满天飞的今天,动画的基本组成部分也离不开“帧”。
补间动画(Tween Animation):从某一帧过度到另一帧有一定数学规律的连贯的动画。比如一个图片从a点匀速运动到b点的动画、亦或是匀变速运动、以抛物线的速度曲线运动等等,当然也不只是规定运动,也可以规定动画的变化是匀变速等,如变大变小、圆变方、变色、旋转等。
2、简单说说css3动画执行的原理
(1) css3中新增了一个animation的属性,该属性类似于创建一个animation对象
如:animation: bounce 2.0s infinite ease-in-out;
animation有以下几个参数:
属性 | 描述 | CSS |
---|---|---|
animation | 所有动画属性的简写属性,除了 animation-play-state 属性。 | 3 |
animation-name | 规定 @keyframes 动画的名称。 | 3 |
animation-duration | 规定动画完成一个周期所花费的秒或毫秒。默认是 0。 | 3 |
animation-timing-function | 规定动画的速度曲线。默认是 "ease"。 | 3 |
animation-delay | 规定动画何时开始。默认是 0。 | 3 |
animation-iteration-count | 规定动画被播放的次数。默认是 1。 | 3 |
animation-direction | 规定动画是否在下一周期逆向地播放。默认是 "normal"。 | 3 |
animation-play-state | 规定动画是否正在运行或暂停。默认是 "running"。 | 3 |
animation-fill-mode | 规定对象动画时间之外的状态。 | 3 |
除了第一个,我依次介绍:
animation-name:这里是一个键值,通过@keyframes 该键值{ 每帧画面 },从0%帧~n%帧的动作变化(注:后面详细说明)
animation-duration:一轮动画总时间s或ms
animation-timing-function:补间动画规则(注:后面详细说明)
animation-delay:动画是否延时播放,延时多少s或ms
animation-iteration-count:动画是否循环,循环多少次,无限循环是“infinite”
animation-direction:正向播放完再逆向播放是“alternate”,只正向播放是“normal”
animation-play-state:控制动画运行或暂停,暂停是“paused”,运行是“running”(一般是通过js来控制这个属性)
animation-fill-mode:属性规定动画在播放之前或之后,其动画效果是否可见。(效果在keyframes 中设定)
“none”不改变默认行为。
“forwards”当动画完成后,保持最后一个属性值(在最后一个关键帧中定义)。
“backwards”在 animation-delay 所指定的一段时间内,在动画显示之前,应用开始属性值(在第一个关键帧中定义)。
“both”向前和向后填充模式都被应用。
(2)通过上面创建了animation的对象后,我们就可以一帧一帧的画图了
在animation-name中定义了一个key值,用它来构建每帧的样式,如下例:
from是开始时样式,to是结束时样式,意思就是从“from”的样式到“to”的样式的变化,比如说from里面背景色是蓝色,to里面背景色是红色,动画会从蓝色变成绿色
下面是效果图:
当然,我们也可以从0%帧~n%帧设置动作变化,如下例:
如上段代码,蓝色->红色->黄色->黑色 的转变,效果图如下:
(3)如何理解和应用 animation-timing-function“补间动画”
这个属性有下面几个参数:
linear:匀速变化
ease:低速开始,然后加快,快结束的时候再放慢
ease-in:低速开始
ease-out:低速结束
ease-in-out:低速开始、低速结束
cubic-bezier(n,n,n,n):n=0~1,自定义“三次贝赛尔曲线”速度变化方式
step:把每个区域变化样式分割成了n帧,start+end帧总计n+1帧
step-start(n)或steps(n,start):不算start帧的n帧(相当于从第2帧开始)
step-end(n)或steps(n,end):不算end帧的n帧(相当于结束于倒数第2帧)
①、linear和ease的对比运动的例子如下:
代码如下:
②、然后介绍一下steps函数,第一个参数是每个区域拆分的帧数,为了方便观察,我把它设置为1帧,例子如下:
如下代码所示:颜色变化分为红、绿、蓝、黄,
第一个图没有红,也就是说step-start从第2帧开始,
第二个图缺少黄,同样是说step-end到倒数第2帧结束。
如上段代码,steps的拆分规则是以一段区间拆分,
即0%~25%的区间拆分n帧,相当于0%帧是start帧,
25%~50%的区间拆分n帧,无start、end帧,
50%~100%的区间拆分n帧,相当于100%帧是end帧,
而n帧是包含start或end帧总共的帧数为n,并且start帧、end帧只能有其一
③、最后一个:animation-timing-function补间动画中有一个“三次贝赛尔曲线”
首先百度上先脑补一下什么叫“三次贝塞尔曲线”:贝塞尔曲线_百度百科
感兴趣的同学可以研究研究,不过看完之后也只能“呵呵。。。”
举个最简单的例子:ps中不是有个钢笔的工具吗,效果图如下
这种效果就是“三次贝塞尔曲线”,然后再细想一下运动的速度是如同该曲线一样的效果,弧度越大越陡变化速度越快,越小越平缓变化速度越慢
(4)最后再来说说animation-fill-mode,这是控制动画播放完时所显示的状态,下面解释摘录自百度
none 表示不设置结束之后的状态,默认情况下回到跟初始状态一样。
forwards 表示将动画元素设置为整个动画结束时的状态。
backwards 明确设置动画结束之后回到初始状态。
both 表示设置为结束或者开始时候的状态。一般都是回到默认状态。
下面再举个例子看看就明白了:
下面是代码:
(5)其实,介绍到目前就已经可以做出完整的动画效果了(逐帧动画),下面我通过上面的介绍绘制一个
下面是sprite素材图:
下面是代码:
①、在@keyframes中只设置了一个过渡区间,而这里的animation-timing-function用steps(4)给这个过渡区间分成4帧,正如素材图的前4帧
②、我们把容器的大小调整至素材图中一个帧图的大小,让div刚好能显示一帧的图片
③、设置初始位置x=0px、和运动结束时的位置x=-128px,因为在这之间给分成了4帧(即steps(4)),因此它的运动轨迹分析如下:
第1帧:background-position:x=0px,显示第1个小人
第2帧:background-position:x=-32px,显示第2个小人
第3帧:background-position:x=-64px,显示第3个小人
第4帧:background-position:x=-96px,显示第4个小人
而steps(4)等同于step-end(4),因此最后一个关键帧background-position:x=-128px不显示,如此循环便可
写到这就算把animation详细的介绍完了,感兴趣的同学咱们多多交流哈,我是Chalk ~~O(∩_∩)O~~
下一篇文章我会继续写css3的动画,来谈谈transform属性。