CSS3动画
在CSS3中,animation属性用于实现元素的动画。
animation属性跟transition属性在功能实现上是非常相似的,都是通过改变元素的属性值来实现动画效果。但是,这两者实际上有着本质的区别
- 对于transition属性来说,它只能将元素的某一个属性从一个属性值过渡到另一个属性值
- 对于animation属性来说,它可以将元素的某一个属性从第1个属性值过渡到第2个属性值,然后还可以继续过渡到第3个属性值,以此类推。
从以上推断出:transition属性(即CSS3过渡)只能实现一次性的动画效果,而animation属性(即CSS3动画)可以实现连续性的动画效果。
CSS3中的animation属性就是为了解决这些问题而提出的。animation属性可以通过控制关键帧来控制动画的每一步,从而实现更为复杂的动画效果。
使用animation属性实现CSS3动画需要两步
- 定义动画:用@keyframes规则来定义动画的样式
- 调用动画:用animation属性来调用@keyframes规则定义的动画
使用@keyframes规则创建动画
概念:在CSS3中,使用@keyframes规则来创建动画。创建动画是指从一个CSS样式到另一个CSS样式逐步变化而产生动画效果的过程。在创建动画中,可以多次更改CSS样式的设定。
一个动画由很多画面组成,每一个画面叫做一帧。其中,角色或者物体运动变化的关键动作所处的帧叫做关键帧。创建动画必须定义关键帧。
语法:
@keyframes animation_name{
    keyframes-selector{css-styles;}
}
属性值说明
| 属性值 | 说明 | 
|---|---|
| animation | 当前动画的名称,它将作为引用该动画时的唯一标识,因此不能为空 | 
| keyframes-selector | 关键帧选择器,指定当前关键帧在整个动画过程中的位置,其值可以是from和to,或者百分比。其中,from和0%效果相同(表示动画的开始),to和100%效果相同(表示动画的结束) | 
| css-style | 定义执行到当前关键帧时对应的动画状态,由CSS样式属性进行定义,多个属性之间用分号(;)分隔,且属性不能为空。 | 
实例:仅定义开头和结尾
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>@keyframes创建动画</title>
		<style>
			*{
				padding:0;
				margin:0;
			}
			div{
				width:200px;
				height:150px;
				margin:20px auto;
				border-radius:20px;
				background-color:blueviolet;
			}
			/* 定义动画 */
			@keyframes colorChange{
				0%{
					background-color:blueviolet;
				}
				100%{
					background-color:greenyellow;
				}
			}
			/* 调用动画,这里可以先看后面 */
			div:hover{
				animation:colorChange 2s linear 0s 5 normal;
			}
		</style>
	</head>
	<body>
		<div class="a"></div>
	</body>
</html>
运行结果

实例:定义多个关键帧
<!DOCTYPE html>
<html>
	<head>
		<meta charset="utf-8">
		<title>@keyframes创建动画</title>
		<style>
			*{
				padding:0;
				margin:0;
			}
			div{
				width:200px;
				height:150px;
				margin:20px auto;
				border-radius:50%;
				background-color:darkblue;
				cursor:pointer;
			}
			/* 定义动画 */
			@keyframes colorChange{
				0%{
					background-color:darkblue;
				}
				25%{
					background:radial-gradient(circle at top,orange 20%,yellow 40%);
				}
				50%{
					background:radial-gradient(circle at center,orange 20%,yellow 40%);
				}
				75%{
					background:radial-gradient(circle at bottom,orange 20%,yellow 40%);
				}
				100%{
					background-color:red;
				}
			}
			/* 调用动画 */
			div:hover{
				animation:colorChange 5s linear;
			}
		</style>
	</head>
	<body>
		<div class="a"></div>
	</body>
</html>
运行结果
 
@keyframes其中的百分比是“持续时间”。在实例:定义多个关键帧中,定义持续时间为5s,则0%指的是0s时,25%指的是1.25s,50%指的是2.5s,75%指的是3.75s,100%指的是5s.
使用animation属性调用动画
概念:CSS3中的animation属性用于调用由@keyframes规则创建的动画。
animation属性是一个复合属性,主要包括6个子属性。
| 属性值 | 说明 | 
|---|---|
| animation-name | 对于指定CSS属性进行进行操作 | 
| animation-duration | 动画的持续时间 | 
| animation-timing-function | 动画的速率变化方式 | 
| animation-delay | 动画的延迟时间 | 
| animation-iteration-count | 动画的播放次数 | 
| animation-direction | 动画的播放方向,正向还是反向 | 
动画名称:animation-name
概念:animation-name属性用于定义要调用的由@keyframes规则创建的动画名称。调用多个动画名称要以逗号隔开。
语法:
anination-name:keyframename|none;
属性值
| 属性值 | 说明 | 
|---|---|
| none | 默认值,表示不应用任何动画,该设置也可以用于取消动画 | 
| keyframename | 用于定义要调用的动画名称。多个动画名称以英文逗号隔开 | 
animation-name调用的动画名需要和@keyframes规则定义的动画名完全一致(区分大小写),如果不一致将不会产生任何动画效果。
持续时间:animation-duration
概念:animation-duration属性用于定义完成一个动画周期所需要的时间。
语法:
animation-duration:time;
属性值
| 属性值 | 说明 | 
|---|---|
| time | 它表示以秒(s)或毫秒(ms)为单位的时间。默认值为0,表示没有任何动画效果。当该参数的值为负数时,则被视为0。 | 
动画方式:animation-timing-function
概念:animation-timing-function属性用来定义动画的速度曲线。“速度曲线”,指的是动画执行过程中的速度变化情况。
语法:
animation-timing-function:linear|ease|ease-in|ease-out|ease-in-out|cubic-bezier(n,n,n,n);
属性值
| 属性值 | 说明 | 速率 | 
|---|---|---|
| linear | 规定以相同速度开始至结束的过渡效果,即”匀速“ |  | 
| ease | 默认值,规定慢速开始,变快之后慢速结束的过渡效果 |  | 
| ease-in | 规定速度越来越快的过渡效果 |  | 
| ease-out | 规定速度越来越慢的过渡效果 |  | 
| ease-in-out | 规定以慢速开始和结束的过渡效果 |  | 
| cubic-bezier(n.n,n,n) | 在cubic-bezier函数中自定义值,参数是0~1的数值 | 
延迟时间:animation-delay
概念:animation-delay属性用来定义执行动画之前等待的时间,即指的是规定动画什么时候开始
语法:
animation-delay:time;
属性值
| 属性值 | 说明 | 
|---|---|
| time | 它表示以秒(s)或毫秒(ms)为单位的时间。默认值为0,表示不延迟(不等待) | 
播放次数:animation-iteration-count
概念:animation-iteration-count属性用来定义动画的播放次数
语法:
animation-iteration-count:number|infinite;
属性值
| 属性值 | 说明 | 
|---|---|
| number | 表示动画重复的次数。默认值为1,即指的是动画默认只播放1次。若属性值为一个整数,则规定动画播放次数。若属性值为一个非整数值,则表示播放动画循环的一部分。例如,0.5s将动画只播放一半。负值是无效的。 | 
| infinite | 表示动画无限次循环播放 | 
播放方向:animation-direction
概念:animation-direction属性用来定义动画的播放方向。
语法:
animation-direction:normal|alternate;
属性值
| 属性值 | 说明 | 
|---|---|
| normal | 默认值,表示动画每次都顺向播放 | 
| reverse | 表示动画每次都反方向播放 | 
| alternate | 表示动画会在奇数次(1次,3次,5次等)顺向播放,但在偶数次(2次,4次,6次等)逆向播放。 | 
实例:loading效果
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <style type="text/css">
	  *{
		  padding:0;
		  margin:0;
	  }
    .contain{
		width:100px;
		margin:20px auto;
		position:relative;
		}
    .contain>i
    {
      position:absolute;
      top:0;
      width:5px;
      height:40px;
      background-color:blueviolet;
      border-radius:6px;
    }
	/*定义动画*/
	@keyframes loading
	{
	  0%{
		  transform:scaleY(1);
		  }
	  50%{
		  transform:scaleY(0.5);
		  }
	  100%{
		  transform:scaleY(1);
		  }
	}
    /*第1个i元素*/
    .contain>i:nth-child(1)
    {
      left: 0;
	  animation-name:loading;
	  animation-duration:1s;
	  animation-timing-function:ease-in;
	  animation-delay:0.1s;
	  animation-iteration-count:infinite;
    }
    /*第2个i元素*/
    .contain>i:nth-child(2)
    {
      left: 10px;
	  animation-name:loading;
	  animation-duration:1s;
	  animation-timing-function:ease-in;
	  animation-delay:0.3s;
	  animation-iteration-count:infinite;
    }
    /*第3个i元素*/
    .contain>i:nth-child(3)
    {
      left: 20px;
	  animation-name:loading;
	  animation-duration:1s;
	  animation-timing-function:ease-in;
	  animation-delay:0.6s;
	  animation-iteration-count:infinite;
    }
    /*第4个i元素*/
    .contain>i:nth-child(4) {
      left: 30px;
	  animation-name:loading;
	  animation-duration:1s;
	  animation-timing-function:ease-in;
	  animation-delay:0.3s;
	  animation-iteration-count:infinite;
    }
  </style>
</head>
<body>
  <div class="contain">
    <i></i>
    <i></i>
    <i></i>
    <i></i>
  </div>
</body>
</html>
运行结果
 
播放状态:animation-play-state
概念:animation-play-state属性用来定义动画的播放状态。
语法:
animation-play-state:running|paused;
属性值
| 属性值 | 说明 | 
|---|---|
| running | 默认值,表示是动画正在播放中 | 
| paused | 表示动画已被暂停 | 
animation属性
概念:animation属性是一个复合属性,可以将以上单项动画子属性在一行内进行复合设置。简写以上繁琐的属性。
语法:
animation:animation-name|animation-duration|animation-timing-function animation-delay|animation-iteration-count|animation-direction;
实例:loading效果
<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <title></title>
  <style type="text/css">
	  *{
		  padding:0;
		  margin:0;
	  }
    .contain{
		width:100px;
		margin:20px auto;
		position:relative;
		}
    .contain>i
    {
      position:absolute;
      top:0;
      width:5px;
      height:40px;
      background-color:blueviolet;
      border-radius:6px;
    }
	/*定义动画*/
	@keyframes loading
	{
	  0%{
		  transform:scaleY(1);
		  }
	  50%{
		  transform:scaleY(0.5);
		  }
	  100%{
		  transform:scaleY(1);
		  }
	}
    /*第1个i元素*/
    .contain>i:nth-child(1)
    {
      left: 0;
     animation: loading 1s ease-in 0.1s infinite;
    }
    /*第2个i元素*/
    .contain>i:nth-child(2)
    {
      left: 10px;
      animation: loading 1s ease-in 0.3s infinite;
    }
    /*第3个i元素*/
    .contain>i:nth-child(3)
    {
      left: 20px;
      animation: loading 1s ease-in 0.6s infinite;
	
    }
    /*第4个i元素*/
    .contain>i:nth-child(4) {
      left: 30px;
      animation: loading 1s ease-in 0.3s infinite;
    }
  </style>
</head>
<body>
  <div class="contain">
    <i></i>
    <i></i>
    <i></i>
    <i></i>
  </div>
</body>
</html>
运行结果

从效果上来看,这两者是等价的。相比较用animation属性的子属性,直接使用animation复合属性上更加简洁清楚。

