CSS 动画学习笔记——Animation篇
首先了解一下 Animation 的基本用法,使用其需要给动画指定一个周期持续的时间,以及动画效果的名称。可以看一下demo
注释:这是一个给透明和背景色属性设置的一个动画过渡效果
实现很简单(具体看到代码中的注释):
1 .block_wrap { 2 width: 500px; 3 height: 500px; 4 background: #e3e3e3; 5 /*第一个参数为这个动画的持续时间,第二个参数是动画效果的标题,可以理解为定义一个class,不过这是专属于动画的class*/ 6 animation: 4s opacity; 7 margin: 0 auto; 8 } 9 /*动画效果,opacity为效果标题,@keyframes必须要写*/ 10 @keyframes opacity { 11 0% {opacity: 0; background: } 12 25% {opacity: 0.25} 13 50% {opacity: 0.5} 14 100% {opacity: 1; background: red} 15 }
除了代码中的注释,另外还需要说一下,opacity 中,从 0%—100%,这是我们给动画指定的一个持续周期,指定了到哪个程度,动画就按照里面的属性进行展示,这个周期是必须的!
上面是一个很简单的动画,刷新一次页面即展示一次,如果想要重复地展示动画效果呢?简单,只需要添加一个 infinite 关键字 ,可以指定循环次数,将 infinite 关键字换成数字即可。
1 /*添加infinite关键字,使其可重复*/ 2 animation: 4s opacity infinite;
注释:这是一个重复展示的动画效果
动画默认在展示完后回到初始状态,有时想让动画定格在最后状态,可以使用 animation-fill-mode 属性,该属性有三个值
- none:默认值,动画展示完后回到初始状态
- backwards:动画回到第一帧的状态
- forwards:动画定格在最后状态
- both:根据animation-direction 轮流应用forwards和backwards规则
使用:
/*直接在后面添加即可*/ animation: 1s opacity forwards;
下面看一下backwards的效果:
注释:backwards的效果,简单动画时,和none差不多
在上面写demo尝试以上属性时,发现动画循环播放时,其实都是从初始状态开始,那么如果不想这样子呢?有另一个属性 animation-direction 可以定义它的播放,direction 有以下值:
- normal:默认值,对动画播放无状态影响
- alternate:改变其播放方向,先是按照正常播放,接着反方向播放,以此循环
- reverse:动画按照反方向播放
- alternate-reverse:先是反方向播放,接着正方向播放,以此循环
1 .block_wrap { 2 width: 500px; 3 height: 500px; 4 background: #e3e3e3; 5 /*添加infinite关键字,使其可重复,接着更换每个不同值看效果*/ 6 animation: 1s opacity infinite alternate-reverse; 7 margin: 0 auto; 8 } 9 /*动画效果,opacity为效果标题,@keyframes必须要写*/ 10 @keyframes opacity { 11 to { 12 transform: rotate(360deg); 13 } 14 }
可以使用上面这段代码,更换每个值看一下效果。
我们在上一篇,transition的学习中有提到,transition是有简写形式的,也可以分开来写。同理,animation也是可以这样的,全部的属性简写如下:
1 /*第一个为动画持续时间,第二个为动画延迟(delay)时间,第三个为动画效果标题,第四个为动画状态变化速度,第五个为循环次数,第五个为动画状态设置,第六个为动画播放方向*/ 2 animation: 1s 1s opacity linear infinite forwards normal;
分开写也是可以的
1 /*动画标题*/ 2 animation-name: opacity; 3 /*动画持续时间*/ 4 animation-duration: 1s; 5 /*动画状态变化速度*/ 6 animation-timing-function: linear; 7 /*动画延迟(delay)时间*/ 8 animation-delay: 1s; 9 /*动画状态设置*/ 10 animation-fill-mode:forwards; 11 /*动画播放方向*/ 12 animation-direction: normal; 13 /*循环次数*/ 14 animation-iteration-count: infinite;
在了解animation的过程中,发现在使用animation时,往往配合着 @keyframes,个人理解为,它是一个专属于动画的class,它用来定义动画的各个状态,下来了解一下它的写法,上述所用到的写法
1 @keyframes opacity { 2 to { 3 transform: rotate(145deg); 4 } 5 }
1 @keyframes opacity { 2 0% {background: red} 3 25% {background: orange} 4 50% {background: pink} 5 100% {background: black} 6 }
@keyframes opacity { from,to { transform: rotate3d(1,1,1,360deg); } 50% { transform: scale(1.2); } }
另外,需要注意的是,from to,它们其实就是 0%-100%的缩写
到了这里,上面的基本上能满足大部分我们项目中的需求了。但是,animation还有一个很好玩的属性——animation-play-state,但从字面意思上来看,很明显就是动画的播放状态。没错,它就是用来控制动画的播放状态。
它有两个值
- pause:暂停
- running:播放
这是一个很有意思的属性,如若编写一个很复杂的动画,并且动画持续时间特长,配合上这个属性,我们相当于用CSS制作一个小动画片。看一下这个属性的效果:
注释:有了控制播放状态的动画
上面的demo看起来很像是卡顿了,其实并不是,只是用hover来控制了动画的播放状态,所以说这是个很有意思的属性。这一段的代码如下:
1 .block_wrap { 2 width: 300px; 3 height: 300px; 4 background: #e3e3e3; 5 animation: 1s opacity linear infinite forwards normal; 6 /*动画原本的状态是暂停的*/ 7 animation-play-state: paused; 8 margin: 0 auto; 9 } 10 /*动画效果,opacity为效果标题,@keyframes必须要写*/ 11 @keyframes opacity { 12 from,to { transform: rotate3d(1,1,1,180deg); } 13 50% { transform: rotate(45deg);} 14 } 15 /*当鼠标放上来时,动画才会进行*/ 16 .block_wrap:hover { 17 animation-play-state: running; 18 }
以上就是关于CSS Animation的内容了,相信这篇文章的内容能够满足到大部分的动画需求了。
另外,使用的时候,需要注意一些东西,那就是浏览器的兼容问题。有些浏览器并不能够很好兼容,所以在使用时,写法上要是这样的
-ms-animation @-ms-keyframes /* IE 9 */ -moz- /* Firefox */ -webkit- /* Safari 和 Chrome */ -o- /* Opera */