文章目录
Animation of CSS3
animation是实现CSS3动画最重要的一个属性,虽然说transition也能实现这样的效果,但是transition实现的只是说从A状态变换到B状态的效果,它想在变换到C状态是办不到的,但是animation可以,animation可以一直变下去,CSS3的动画效果主要还是围绕着animation展开的。
但是CSS3的动画效果也没那么强大,只能实现一些简单的动画。
在开始之前先写一个方块,通过让这个方块运动来研究animation是怎么运用的。
keyframes
要用animation实现状态的改变的话,就必须把这些状态记录下来,放到一个容器里面,然后按照顺序来执行,这个容器就是@keyframes
也就是关键帧容器:
有几个状态就定义几个关键帧,怎么定义关键帧呢,要用百分数来做:
@keyframes run {
0%{}
25%{}
50%{}
75%{}
100%{}
}
其实0%也可以写成from
,100%也可以写成to
,其他的都没有特殊写法。
兼容性问题的话,过渡版本的浏览器是要加上-webkit-的:
animation-name、animation-duration
接下来用这个属性让方块转圈:
@keyframes{
0%{
left:0;
top:0;
}
25%{
left:100px;
top:0;
}
50%{
left:100px;
top:100px;
}
75%{
left:0;
top:100px;
}
100%{
left:0;
top:0;
}
}
div{
position:absolute;
width:100px;
height:100px;
background-color: red;
animation: run 4s;
}
这样就可以让方块绕正方形轨迹运动,run
也就是animation-name
,时间是按照着关键帧所占的比例相应划分。
当然也可以填多组值:
animation:run 4s, color-change 4s;
animation-timing-function、animation-delay
这两个属性的作用和transition里面是相似的。
但是animation-timing-function
控制的是每两个关键帧之间的过渡,也就是每一段之间的过渡都是相同的。
animation-iteration-count
这个属性控制动画执行多少次。
可以填数字,也可以填 infinite
无限循环。
animation-direction
这个属性定义运动方向。
normal
正常方向。
reverse
反方向运行。
alternate
动画先正常运行再反方向运行,并持续交替运行。
这个可以实现一个钟摆运动。
alternate-reverse
动画先反运行再正方向运行,并持续交替运行。
这个属性值是不常用的,因为没必要,提前设置好方向的话,altemate也就够用了。
animation-play-state
这个属性检索或设置对象动画的状态,有两个属性值,默认值是running
,也就是鼠标放上去以后运动,还有一个属性值是pause
,在鼠标放上去后可以暂停方块的运动,但是这个属性不常用,因为兼容性有问题,有的浏览器在鼠标放上去以后可以暂停,但是鼠标离开以后不会继续运动,所以这个属性尽量不用。
animation-fill-mode
动画运动完以后会回归到原始状态,那这个属性设置对象动画时间之外的状态。
none
默认值。不设置对象动画之外的状态。
forwards
设置对象状态为动画结束时的状态,这个属性值只是设置动画最后一帧结束之后的状态,不可以设置开始之前的。
backwards
设置对象状态为动画开始时的状态,这个属性也不可以设置结束之后的状态,只针对动画开始之前的状态。
both
设置对象状态为动画结束或开始的状态,这个属性值用的比较多。
应用
现在做一个太阳和月亮交替升落的动画,在做动画之前一定要看属性支不支持。
<div class="space"></div>
<div class="sun"></div>
<div class="moon"></div>
*{
margin:0;
padding:0;
}
body{
background-color: #000;
}
@keyframes space-change{
0%{
opacity: .3;
}
25%{
opacity: 1;
}
50%{
opacity: .3;
}
75%{
opacity: .1;
}
100%{
opacity: .3;
}
}
@keyframes sunrise{
0%{
opacity: 0;
}
10%{
opacity: 1;
transform:scale(.7, .7) translatex(0) translatey(0);
}
30%{
transform:scale(.5, .5) translatex(0) translatey(-500px);
opacity: 1;
}
50%{
opacity: 0;
transform:scale(.7, .7) translatex(400px) translatey(0);
}
100%{
opacity: 0;
}
}
@keyframes moonrise{
0%{
opacity: 0;
}
30%{
opacity: 0;
transform:translatey(0);
}
50%{
opacity: 0;
}
70%{
transform:translatey(-300px);
opacity: 1;
}
80%{
transform:translatey(-300px);
opacity: 1;
}
90%{
opacity: 0;
}
100%{
transform:translatey(0);
opacity: 0;
}
}
.space{
height:500px;
background-image: linear-gradient(to bottom, rgba(0, 130, 255, 1), rgba(255, 255, 255, 1));
animation: space-change 10s cubic-bezier(.5,0,.5,1) infinite;
}
.sun{
position: absolute;
left:calc(50% - 25px);
top:calc(50% - 25px);
width:50px;
height:50px;
background-color: #fff;
border-radius:50%;
transform:scale(.5, .5);
box-shadow: 0px 0px 100px 50px #fff,
0px 0px 250px 125px #ff0;
animation:sunrise 10s infinite;
}
.moon{
position: absolute;
left:calc(50% + 400px);
top:calc(50% - 50px);
width:100px;
height:100px;
background-color: #fff;
border-radius: 50%;
box-shadow: 0px 0px 8px #fff, inset 0px 0px 8px #000;
animation:moonrise 10s cubic-bezier(0,0,.5,.5) infinite;
}
.moon::after{
position: absolute;
content:"";
width:90px;
height:90px;
background-color: #000;
border-radius: 50%;
left:-10px;
top:-10px;
}