动画,两个状态之间的转换,可以使用过度来解决。如果是多个状态之间的转换,就需要使用动画了,并且动画过程是可按的,例如是否循环,是否捆住,最终画面等等。
白龙网特别提醒,动画要先定义(关键词、花括号、从A到B),后使用(关键词:动画名称 动画时间,两个参数之间用空格隔开)。可以定义两个状态之间的转换(from/to),也可以定义多个状态之间的转换(百分比)。
(1)两个状态之间的动画
<style>
div {
width: 200px;
height: 200px;
background-color:red;
/* 调用已定义的动画:动画名称、动画时间 */
animation: change 5s;
}
/* 用from/to定义两种宽度变化的动画 */
@keyframes change {
from {
width: 200px;
}
to {
width: 600px;
}
}
</style>
</head>
<body>
(2)多种动画之间的转换
<style>
div {
width: 200px;
height: 200px;
background-color:red;
/* 调用已定义的动画:动画名称、动画时间 */
animation: change 5s;
}
/* 用百分比定义多种宽度变化的动画 */
@keyframes change {
0% {
width: 200px;
}
50% {
width: 500px;
height: 800px;
}
100% {
width: 800px;
height: 300px;
}
}
</style>
</head>
<body>
(3)调用动画的参数
animation:动画名称 动画时长 速度曲线(linear/step()) 延迟时间 重复次数(4/infinite) 动画方向(alternate) 结束状态(backwards/forwards),各参数之间用空格隔开。
<style>
div {
width: 200px;
height: 200px;
background-color:red;
/* 动画名称、动画时长,这两个参数必须要出现;参数不分先后顺序;如果有两个数值,那么第一个数值表示时长,第二个数值表示延迟时长。 */
animation: change 5s;
/* 速度曲线:匀速、非匀速 */
animation: change 2s linear;
animation: change 2s steps(3);
/* 延迟时间 */
animation: change 2s 3s;
/* 重新次数:指定次数,则写数字即可;无限循环,使用infinite关键词即可。 */
animation: change 2s 5;
animation: change 2s infinite;
/* 动画方向,常用,与无限循环配合使用 */
animation: change 2s infinite alternate;
/* 动画结束后状态有两个,backwards是默认状态,无效果;forwards是结束时的状态,需要注意的是,该关键词不能与无限循环一起使用 */
animation: change 2s backwards;
animation: change 2s forwards;
}
@keyframes change {
from {
width: 200px;
}
to {
width: 600px;
}
}
</style>
</head>
<body>
<div></div>
</body>
另外,动画的所有参数都可以拆分开来单独书写,如下:
animation-name: change;
animation-duration: 3s;
animation-timing-function: linear;
animation-timing-function: steps(3);
animation-delay: 4s;
animation-iteration-count: infinite;
animation-iteration-count: 5;
animation-direction: alternate;
animation-fill-mode: backwards;
animation-fill-mode: forwards;
animation-play-state: paused;
(4)动画类型
精灵图+速度曲线steps,可以制作逐帧动画。而另外一种匀速的动画,叫补间动画。
逐帧动画的实现方法,分为三步,首先是布局盒子,盒子的宽高与每个精灵图的宽高相同,根据精灵图的宽度W以及精灵图中小图的数量C,求出每个小图的宽度W/C,高度就是精灵图的高度,根据上述两个参数亮度、高度,新建一个盒子,并把精灵图设置为盒子的背景图片。其次是要定义动画,即:在动画中定义背景精灵图的水平、垂直位置的初值与最终值;最后在盒子中调用定义的动画即可,而动画的参数分别为:动画名、动画时间、速度曲线(steps(12)属性要设置成小精灵图片的个数)、重复次数(无限循环infinite)。
<style>
div {
width: 103px;
height: 103px;
background-image: url(./sp.jpg);
animation: move 2s steps(12) infinite;
}
@keyframes move {
from {
background-position: 0 0;
}
to {
background-position: -1237px 0;
}
}
</style>
</head>
<body>
(5)奔跑效果
多组动画-小人从一个位置跑到另外一个位置
多组动画,可以复加使用。方法是用逗号隔开每一动画的名称与其属性。另外,如果动画的初始位置与盒子的初始样式相同时,可以省略from。
<style>
div {
width: 103px;
height: 103px;
background-image: url(./sp.jpg);
animation: move 2s steps(12) infinite,
run 3s forwards;
}
@keyframes move {
from {
background-position: 0 0;
}
to {
background-position: -1237px 0;
}
}
@keyframes run {
from {
transform: translateX(0);
}
to {
transform: translateX(800px);
}
}
</style>
</head>
<body>
<div></div>
</body>
(6)走马灯效果
7张图片的走马灯效果,每次展示3张图片。根据题意可知,首先,布局的盒子宽度是3张图片的宽度,高度是图片的高度;7张图片放到UL/LI之中,浮动之后,由于.box盒子装不下7张图片的宽度,有故而LI会换行,此时把UL设置成7张图片的宽度,.box设置成超出隐藏,即可让7张图片显示在一行。其次,定义使用动画,其实就是让图片在UL中移动7张图片的宽度,即定义7张图片宽度的动画,让UL调用;但是,此时会出现一个问题,即7张图片移动之后,.box成空白了。故而需要把前3张图片复制一份放到7张图片的后面用以占位,那么此时UL的宽度应该变为10张图片的宽度了。再次,可以设置一个HOVER效果,当鼠标经过.box盒子时,让UL移动效果暂停下来。
<style>
* {
margin: 0;
padding: 0;
}
ul,li {
list-style:none;
}
.box {
margin: 0 auto;
width: 957px;
height: 319px;
border: 1px solid black;
overflow: hidden;
}
.box ul {
width: 3190px;
height: 319px;
animation: move 5s infinite;
}
.box ul li {
float: left;
}
@keyframes move {
to {
transform: translateX(-2233px);
}
}
.box:hover ul {
animation-play-state: paused;
}
</style>
</head>
<body>
<div class="box">
<ul>
<li><img src="./image/clothes_goods_1.jpg" alt=""></li>
<li><img src="./image/clothes_goods_2.jpg" alt=""></li>
<li><img src="./image/clothes_goods_3.jpg" alt=""></li>
<li><img src="./image/clothes_goods_4.jpg" alt=""></li>
<li><img src="./image/clothes_goods_5.jpg" alt=""></li>
<li><img src="./image/clothes_goods_6.jpg" alt=""></li>
<li><img src="./image/clothes_goods_7.jpg" alt=""></li>
<li><img src="./image/clothes_goods_1.jpg" alt=""></li>
<li><img src="./image/clothes_goods_2.jpg" alt=""></li>
<li><img src="./image/clothes_goods_3.jpg" alt=""></li>
</ul>
</div>
</body>
(7)布局经验
当给body添加背景图片占满浏览器位置时,必须给html/body一个100%的高度,否则无法占满整个浏览器窗口。
动画效果的实现,一般是先引入内容,再定义动画,最后调用动画,即可。