ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
## 20.7.1.基本概念和语法 动画效果其实可以看着过渡效果的升华版: 过渡效果是实现元素在某个(或某些)属性的两个不同值之间的状态变化效果; 动画效果是预先定义好某个(或某些)属性的多个不同值之间的状态变化效果,并对之命名,而后可多次应用在不同的元素上。 简单说就是: 过渡效果是“实现某元素的某种状态变化效果”, 动画效果是“定义某种状态变化效果,并可拿来用”。 动画效果的基本语法如下: ``` <style> @keyframes 动画名{ 0% {属性设置。。。} /*表示动画的起始处/* ...... {属性设置。。。} /*这表示还可以设置中间的若干状态*/ 100% {属性设置。。。} /*表示动画的结束处/* } 选择器{ animation:动画名 动画播放设置; /*动画播放设置有若干项控制项*/ } </style> ``` 说明: 1,可以设置(定义)若干个动画(取不同名称),后续都可以用在不同的元素上(选择器所决定); 2,每个动画可以定义若干个关键状态(百分比决定),通常至少需要0%和100%; 3,每个状态可以定义若干个属性值,表示动画播放到该时刻时的元素外观表现; 4,属性的设置跟通常css的属性设置一样,比如:color:red; width:200px; transform:rotate(90deg); 5,动画播放设置中可以设置若干项,比如:持续时间,播放方式,延迟时间,是否循环,等等; ## 20.7.2.主要属性 * animation-name:动画名; * animation-duration:动画持续时间; * animation-timing-function:动画播放播放方式(效果),也有如下几个常用的效果名: linear:线性过渡,就是匀速进行 ease:平滑过渡,这是默认值 ease-in:由慢到快。 ease-out:由快到慢。 ease-in-out:由慢到快再到慢。 * animation-delay:动画播放前的延迟时间; * animation-iteration-count:动画播放循环次数,使用数字或infinite(无限); * animation-direction:动画播放方向(正向还是反向),可用的值有: normal:常规(就是从前往后播放) reverse:反向(就是从后往前播放) alternate:交替(就是先从前往后,再从后往前),播放次数大于1次才有意义 alternate-reverse:反向交替(就是先从后往前,再从前往后),播放次数大于1次才有意义 * animation-fill-mode:动画停止(播放结束)时元素停留的状态,可用的值有: forwards: 停留在前面(动画播放的结尾处); backwards: 停留在后面(动画播放的开时处); both: 两边都可停(动画停在哪边就哪边); * animation-play-state:设置动画启动或暂停,有两个可用的值: running: 运行状态(默认值),也就是运行动画效果; paused: 暂停状态,也就是动画效果运行中停下来(此时如果需要还可以继续运行); * animation:上述属性的综合属性,并依次按该顺序列出(不需要的项直接省略); 举例1: ``` @keyframes ani1{ 0%{ background:red; transform:rotate(0deg);} 100%{ background:blue; transform:rotate(360deg);} } .c1{ animation-name: ani1; animation-duration: 3s; animation-timing-function: ease-in-out; animation-iteration-count:infinite; } ``` 举例2: ``` (本例跟上面例1的效果一样,无非是用了综合属性animation) $keyframes ani1{ 0%{ background:red; transform:rotate(0deg);} 100%{ background:blue; transform:rotate(360deg);} } .c1{ animation: ani1 3s ease-in-out infinite; } ``` 代码示例: ![](https://img.kancloud.cn/d3/3f/d33f9a0cecc0df4e55316cc9973b654a_814x508.png) 演示animation-direction,和animation-fill-mode: ``` <style> @keyframes moveLeft2Right{ 0%{ left:0px; } 100%{ left:800px; } } div{ border:solid 1px red; width: 100px; height:50px; margin:5px; position:relative; left:0px; animation-name:moveLeft2Right; animation-timing-function:linear; animation-duration: 5s; animation-iteration-count:3; } .box1{ animation-direction: normal; animation-fill-mode: forwards; } .box1:hover{ animation-play-state:paused; } .box2{ animation-direction: reverse; animation-fill-mode: backwards; } .box3{ animation-direction: alternate; animation-fill-mode: both; } .box4{ animation-direction: alternate-reverse; animation-fill-mode: both; } </style> </head> <body> <div class="box1">normal, forwards</div> <div class="box2">reverse, backwards</div> <div class="box3">alternate, both</div> <div class="box4">alternate-reverse, both</div> </body> ``` ## 20.7.3.案例 ![](https://img.kancloud.cn/e4/6d/e46d825ee991ab43fb2bb7f82b2e7475_728x403.png) ### 连续播放效果的代码: ``` <style> @keyframes xuanzhuan{ 0%{ transform:rotatex(-15deg) rotatey(0deg); } 100%{ transform:rotatex(-15deg) rotatey(360deg); } } .box{ border:solid 0px red; width:960px; margin:50px auto 10px; perspective: 1200px; perspective-origin: center center; } .box>.container{ border:solid 0px blue; width:200px; height:300px; position: relative; left:50%; margin-left:-100px; transform-style:preserve-3d; transform:rotatex(-15deg); animation-name: xuanzhuan; animation-duration: 6s; animation-timing-function: linear; animation-iteration-count: infinite; } .box>.container:hover{ animation-play-state: paused; } .box>.container>img{ width:200px; height:300px; position: absolute; left:0; top:0; transform-origin: center center; } .box>.container>img:nth-child(1){transform: rotatey(0deg) translatez(300px)} .box>.container>img:nth-child(2){transform: rotatey(40deg) translatez(300px)} .box>.container>img:nth-child(3){transform: rotatey(80deg) translatez(300px)} .box>.container>img:nth-child(4){transform: rotatey(120deg) translatez(300px)} .box>.container>img:nth-child(5){transform: rotatey(160deg) translatez(300px)} .box>.container>img:nth-child(6){transform: rotatey(200deg) translatez(300px)} .box>.container>img:nth-child(7){transform: rotatey(240deg) translatez(300px)} .box>.container>img:nth-child(8){transform: rotatey(280deg) translatez(300px)} .box>.container>img:nth-child(9){transform: rotatey(320deg) translatez(300px)} </style> </head> <body> <div class="box" title="场景,舞台"> <div class="container" title="容器"> <img src="images/girl1.jpg" alt=""> <img src="images/girl2.jpg" alt=""> <img src="images/girl3.jpg" alt=""> <img src="images/girl4.jpg" alt=""> <img src="images/girl5.jpg" alt=""> <img src="images/girl6.jpg" alt=""> <img src="images/girl7.jpg" alt=""> <img src="images/girl8.jpg" alt=""> <img src="images/girl9.jpg" alt=""> </div> </div> </body> ``` ### 一走一停播放效果的关键代码: ``` @keyframes xuanzhuan{ 0%{transform:rotatex(-15deg) rotatey(0deg);} /*表示从0%时间到2%时间,旋转从0到40deg,下同*/ 2%{transform:rotatex(-15deg) rotatey(40deg);} /*表示从2%时间到11%时间,旋转不变,即不旋转,下同*/ 11%{transform:rotatex(-15deg) rotatey(40deg);} 13%{transform:rotatex(-15deg) rotatey(80deg);} 22%{transform:rotatex(-15deg) rotatey(80deg);} 24%{transform:rotatex(-15deg) rotatey(120deg);} 33%{transform:rotatex(-15deg) rotatey(120deg);} 35%{transform:rotatex(-15deg) rotatey(160deg);} 44%{transform:rotatex(-15deg) rotatey(160deg);} 46%{transform:rotatex(-15deg) rotatey(200deg);} 55%{transform:rotatex(-15deg) rotatey(200deg);} 57%{transform:rotatex(-15deg) rotatey(240deg);} 66%{transform:rotatex(-15deg) rotatey(240deg);} 68%{transform:rotatex(-15deg) rotatey(280deg);} 77%{transform:rotatex(-15deg) rotatey(280deg);} 79%{transform:rotatex(-15deg) rotatey(320deg);} 88%{transform:rotatex(-15deg) rotatey(320deg);} 90%{transform:rotatex(-15deg) rotatey(360deg);} 99%{transform:rotatex(-15deg) rotatey(360deg);} } ``` ### 补充案例1: ``` <style> ul{ margin:0 auto; padding:8px 0 0; height:42px; background: url(images/滑动门bg1.png) repeat-x; } ul>li{ list-style: none; float:left; height:50px; padding:0 10px; } ul>li>a{ line-height: 33px; height:33px; display: inline-block; color:white; padding-left:15px; background: url(images/滑动门bg2.png) left -48px no-repeat; } ul>li>a:hover{ background-position: left top; } ul>li>a>span{ line-height: 33px; display: inline-block; height:33px; padding-right:15px; background: url(images/滑动门bg2.png) right -48px no-repeat; } ul>li>a:hover>span{ background-position: right top; } </style> </head> <body> <ul> <li><a href=""><span>首页</span></a></li> <li><a href=""><span>&nbsp;&nbsp;三个字</span></a></li> <li><a href=""><span>在线词典</span></a></li> <li><a href=""><span>五个字标题</span></a></li> </ul> ``` ### 补充案例2(滑动门): ``` <style> .nav{ display:flex; } .nav>a{ display: inline-block; height:35px; padding-left:7px; background: url(images/bg_r1_c1.png) left top no-repeat; } .nav>a:hover{ background-image: url(images/blue_r1_c1.png); } .nav>a>span{ display: inline-block; height:35px; line-height: 35px; padding-right:25px; background: url(images/bg_r1_c2.png) right top no-repeat; } .nav>a:hover>span{ background-image: url(images/blue_r1_c2.png); } </style> </head> <body> <div class="nav"> <a href=""><span>首页</span></a> <a href=""><span>三个字</span></a> <a href=""><span>四字标题</span></a> <a href=""><span>五个字标题</span></a> </div> ``` ### 补充案例3(手风琴效果): ``` <meta charset="UTF-8"> <title>Document</title> <style> .box{ display: flex; border:solid 1px red; width:600px; margin:0 auto; } .box>div{ /*下一行表示,如果容器盒子放下子盒子的设置宽度还有剩余,就去按该比例“分配” 这里,因为所有div都是1,所以就是均分剩余空隙*/ flex:1; height:240px; width:100px; margin:1px; border:solid 1px blue; transition:flex 1s, background 1s; } .box>div:hover{ flex:1.5; background: yellow; } </style> </head> <body> <div class="box"> <div>内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1内容1</div> <div>内容2内容2内容2内容2内容2内容2内容2内容2内容2内容2</div> <div>内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3内容3</div> <div>内容4内容4内容4内容4内容4内容4</div> <div>内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5内容5</div> </div> </body> ```