细说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属性。

posted @ 2017-05-10 14:41  冉夜  阅读(5533)  评论(0编辑  收藏  举报