可通过设置多个节点来精确的控制一个或者一组动画,从而实现复杂的动画效果。
1.0%是动画的开始可以用from替代,100%是动画的完成可用to替代。
2.在CSS中用@keyframes中定义动画的样式,在用选择器调用animation调用动画
3.动画是是元素从一种样式逐渐变化成另一种样式的效果。可以任意改变动画节点。
@keyframes 动画名称 {
0%{
初始状态属性
}
100%{
结束状态属性
}
}
div {
<!--调用动画-->
animation-name:动画名称;
<!--动画持续时间-->
animation-duration:time;
}
@keyframes move {
/* 初始状态 */
0% {
transform: translate(0, 0);
}
/* 结束状态 */
100% {
transform: translate(1200px, 0);
}
}
.box1 {
background-color: #f34;
/* 调用动画名称 */
animation-name: move;
/* 动画持续时间 */
animation-duration: 3s;
}
@keyframes move {
/* 初始状态 */
0% {
transform: translate(0, 0);
}
/* 百分比是动画总时间的百分比:10s+25%=2.5s */
/* 百分比要是整数 */
25% {
transform: translate(1200px, 0);
}
/* 移动的位置时相对于初始位置,不是相对于自身 */
50% {
transform: translate(1200px, 500px);
}
75% {
transform: translate(0, 500px);
}
100% {
transform: translate(0, 0);
}
}
div {
width: 100px;
height: 100px;
background-color: #f34;
animation-name: move;
animation-duration: 10s;
}
1.根据动画的时间,用百分比控制多个节点的动画状态。
2.节点的百分比必须是整数。
3.动画中的移动位置始终是相对于元素的初始位置。
div {
width: 100px;
height: 100px;
background-color: #f34
/* 动画名称(必写) */
animation-name: move;
/* 动画完成一个周期需要花费的时间(必写) */
animation-duration: 3s;
}
.box2 {
/* 动画的速度曲线,类似于过渡,默认是ease */
animation-timing-function: ease;
/* 动画何时开始,默认是0 */
animation-delay: 2s;
}
.box3 {
/* 动画播放的次数,默认是1,循环播放是infinite */
animation-iteration-count: infinite;
}
.box4 {
/* 要逆向播放必须要有循环播放 */
animation-iteration-count: infinite;
/* 动画下一周期是否逆向播放,默认是normal,逆向alternate */
/* animation-direction: normal; */
animation-direction: alternate;
}
.box5 {
/* 动画结束后是否回到起始位置,默认是backwards,保持最终状态forwards */
/* animation-fill-mode: backwards; */
animation-fill-mode: forwards;
}
.box6:hover {
/* 规定动画是否运行或者暂停,默认是running,暂停是paused */
animation-play-state: paused;
}
.box1 {
/* 书写顺序 */
/* animation: name duration timing-function delay iteration-count direction fill-mode; */
/* animation:动画名称 动画一周期时间 运动曲线 何时开始 运动次数 是否反向 运动结束后是否保留最终状态 */
animation: move 3s linear 1s infinite alternate backwards;
}
.box2 {
/* 动画名称和运动时间必写,其余的省略就是默认值 */
animation: move 3s forwards;
}
.box2:hover {
/* 运动暂停不能简写,一般和hover搭配使用 */
animation-play-state: paused;
}
.box3 {
/* 动画简写没有顺序之分,如果写了两个时间,第一个时间必须是运动时间,第二个必须是何时开始 */
animation: 3s 1s linear backwards infinite alternate move;
}
1.动画属性name和duration必写,其余的不写就是默认值。
2.动画属性简写除了动画时间和何时开始以外没有顺序之分。只有一个时间时,就是运动时间,何时开始取默认值0;有两个时间时,第一个时间必是运动时间,第二个是何时开始。
3.运动是否暂停不包含在简写范围内,需要搭配:hover使用。
.box1 {
/* 默认ease,低速开始,逐渐加快,结束前变慢 */
animation: width 2s ease infinite;
}
.box2 {
/* linear匀速 */
animation: width 2s linear infinite;
}
.box3 {
/* ease-in运动以低速开始 */
animation: width 2s ease-in infinite;
}
.box4 {
/* ease-out运动以低速结束 */
animation: width 2s ease-out infinite;
}
.box5 {
/* ease-in-out运动以低速开始并结束 */
animation: width 2s ease-in-out infinite;
}
.box6 {
/* steps运动分为几步来完成 */
animation: width 2s steps(10) infinite;
}
.box7 {
/* steps运动分为几步来完成 */
animation: width 2s steps(30) infinite;
}
1.下载Animate.css网站的css文件
2.引包
3.在要加入动画的属性加上类名animated调用
4.最后添加你想要动画效果的类名即可
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<link rel="stylesheet" href="./animate.css">
<style>
div {
width: 100px;
height: 80px;
font-size: 20px;
color: red;
}
</style>
</head>
<body>
<div class="animated jello">小艾同学</div>
<div class="animated bounceIn">小艾同学</div>
<div class="animated bounceOutDown">小艾同学</div>
<div class="animated fadeInLeft">小艾同学</div>
<div class="animated flipInY">小艾同学</div>
<div class="animated lightSpeedIn">小艾同学</div>
<div class="animated rotateOut">小艾同学</div>
<div class="animated hinge">小艾同学</div>
<div class="animated zoomOutLeft">小艾同学</div>
</body>
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.clock {
position: relative;
width: 200px;
height: 200px;
border: 3px solid #000;
border-radius: 50%;
margin: 100px auto;
}
div[class^=line] {
position: absolute;
top: 0;
left: 50%;
width: 2px;
height: 200px;
background: #000;
}
/* 提权 */
.clock .line1,
.clock .line4 {
width: 5px;
}
.line2 {
transform: rotate(30deg);
}
.line3 {
transform: rotate(60deg);
}
.clock .line4 {
transform: rotate(90deg);
}
.line5 {
transform: rotate(120deg);
}
.line6 {
transform: rotate(150deg);
}
.cover {
position: absolute;
top: 10px;
left: 12px;
width: 180px;
height: 180px;
border-radius: 50%;
background-color: #fff;
z-index: 2;
}
.second,
.minute,
.hour {
position: absolute;
left: 50%;
transform: translateX(-50%);
border-radius: 50% 50% 0 0;
background-color: #000;
transform-origin: bottom center;
z-index: 9;
}
.second {
top: 5%;
width: 3px;
height: 45%;
background-color: red;
animation: clock 60s steps(60) infinite;
}
.minute {
top: 20%;
width: 5px;
height: 30%;
background-color: #09f;
/* 60*60 */
animation: clock 3600s steps(60) infinite;
}
.hour {
top: 30%;
width: 8px;
height: 20%;
/* 12*60*60 */
animation: clock 43200s steps(60) infinite;
}
@keyframes clock {
0% {
transform: translate(-50%) rotate(0deg);
}
100% {
transform: translate(-50%) rotate(360deg);
}
}
.point {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 10px;
height: 10px;
border-radius: 50%;
background-color: orange;
z-index: 999;
}
</style>
</head>
<body>
<div class="clock">
<div class="cover"></div>
<div class="line1"></div>
<div class="line2"></div>
<div class="line3"></div>
<div class="line4"></div>
<div class="line5"></div>
<div class="line6"></div>
<div class="second"></div>
<div class="minute"></div>
<div class="hour"></div>
<div class="point"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
position: relative;
float: left;
width: 400px;
height: 600px;
margin-top: 100px;
}
.box .car {
width: 400px;
height: 400px;
/* 2s匀速循环 */
animation: fengCar 2s linear infinite;
}
.box .car [class ^=box] {
position: absolute;
/* 宽是高的一半 */
width: 100px;
height: 200px;
/* 半圆 */
border-radius: 200px 0 0 200px;
background-color: #09f;
background: linear-gradient(to top, #09f, #90f);
}
.box .car .box1 {
left: 100px;
top: 0;
}
.box .car .box2 {
left: 250px;
top: 50px;
transform: rotate(90deg);
}
.box .car .box3 {
left: 200px;
top: 200px;
transform: rotate(180deg);
}
.box .car .box4 {
left: 50px;
top: 150px;
transform: rotate(-90deg);
}
.box .line {
position: absolute;
left: 50%;
transform: translate(-50%, -50%);
width: 5px;
height: 400px;
background: linear-gradient(to bottom, #09f, #90f);
/* 将柱子藏到后面 */
z-index: -1;
}
/* 鼠标经过悬停 */
.box .car:hover {
animation-play-state: paused;
}
@keyframes fengCar {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
</style>
</head>
<body>
<div class="box">
<div class="car">
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
<div class="box4"></div>
</div>
<div class="line"></div>
</div>
<div class="box">
<div class="car">
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
<div class="box4"></div>
</div>
<div class="line"></div>
</div>
<div class="box">
<div class="car">
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
<div class="box4"></div>
</div>
<div class="line"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.box {
position: relative;
}
.loading,
.loading::after,
.loading::before {
width: 10px;
height: 40px;
background-color: #f34;
animation: loading 1s infinite ease-in-out alternate;
}
.loading {
position: relative;
margin: 100px auto;
animation-delay: 0.2s;
}
.loading::after,
.loading::before {
content: "";
position: absolute;
top: 0;
left: 0;
}
.loading::after {
margin-left: 15px;
animation-delay: 0.4s;
}
.loading::before {
margin-left: -15px;
}
@keyframes loading {
0% {
box-shadow: 0 0 #f34;
height: 40px;
}
40% {
box-shadow: 0 -20px #f34;
height: 50px;
}
100% {
box-shadow: 0 0 #f34;
height: 40px;
}
}
.box p {
position: absolute;
top: 50px;
left: 690px;
color: #f34;
}
</style>
</head>
<body>
<div class="box">
<div class="loading"></div>
<p> loading....</p>
</div>
</body>
</html>
鱼
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
background-color: #09f;
}
.small_fish {
width: 174px;
height: 124px;
background: url(‘https://user-gold-cdn.xitu.io/2020/4/8/17157d8bff70a368?w=174&h=1512&f=png&s=103179‘) no-repeat;
animation: smallYao 1.5s steps(12) infinite, swiming 8s infinite;
}
.gold_shark,
.blue_shark {
width: 509px;
height: 250px;
}
.gold_shark {
background: url(‘https://user-gold-cdn.xitu.io/2020/4/8/17157da20113b126?w=516&h=3276&f=png&s=391429‘) no-repeat;
animation: goldYao 1.5s steps(12) infinite, swiming 5s infinite;
}
.blue_shark {
background: url(‘https://user-gold-cdn.xitu.io/2020/4/8/17157d9b58f869ec?w=509&h=3240&f=png&s=294128‘) no-repeat;
animation: blueYao 1.5s steps(12) infinite, swiming 3s infinite;
}
@keyframes smallYao {
0% {
background-position: 0 0;
}
100% {
background-position: 0 -1512px;
}
}
@keyframes goldYao {
0% {
background-position: 0 0;
}
100% {
background-position: 0 -3276px;
}
}
@keyframes blueYao {
0% {
background-position: 0 0;
}
100% {
background-position: 0 -3240px;
}
}
@keyframes swiming {
/* 初始 */
0% {
transform: translate(0px) rotate(0);
}
/* 游到头 */
40% {
transform: translate(890px) rotate(0);
}
/* 掉头,换方向 */
50% {
transform: translate(890px) rotate(180deg);
}
/* 回到起点 */
90% {
transform: translate(0px) rotate(180deg);
}
/* 换方向 */
100% {
transform: translate(0px) translate(360deg);
}
}
</style>
</head>
<body>
<div class="small_fish"></div>
<div class="gold_shark"></div>
<div class="blue_shark"></div>
</body>
</html>
阴阳师
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
.f4 {
position: fixed;
bottom: 0;
left: 0;
width: 100%;
/* 高度是最高图片的高度 */
height: 176px;
/* background-color: #f34; */
}
div[class^="box"] {
position: absolute;
left: 0;
bottom: 0;
transform: translateX(-200px);
animation: move 10s linear infinite;
}
div[class^="box"]::after {
content: "";
position: absolute;
left: 0;
bottom: 0;
background-repeat: no-repeat;
animation-timing-function: steps(2);
animation-iteration-count: infinite;
}
.box1 {
width: 154px;
height: 121px;
}
.box1::after {
width: 154px;
height: 121px;
background-image: url(https://user-gold-cdn.xitu.io/2020/4/8/17157df9ff38c0fb?w=308&h=121&f=png&s=14349);
/* 分两步 */
animation: box1after .4s;
}
@keyframes move {
0% {
transform: translateX(-200px);
}
100% {
transform: translateX(1920px);
}
}
@keyframes box1after {
0% {
background-position: 0 0;
}
100% {
/* 整个图片的宽度 */
background-position: -308px 0;
}
}
.f4 .box2 {
width: 167px;
height: 176px;
animation-delay: 1.5s;
}
.box2::after {
width: 167px;
height: 176px;
background-image: url(https://user-gold-cdn.xitu.io/2020/4/8/17157e001b70cd4e?w=334&h=176&f=png&s=14686);
/* 分两步 */
animation: box2after .4s;
}
@keyframes box2after {
0% {
background-position: 0 0;
}
100% {
/* 整个图片的宽度 */
background-position: -334px 0;
}
}
.f4 .box3 {
width: 161px;
height: 149px;
animation-delay: 3s;
}
.box3::after {
width: 161px;
height: 149px;
background-image: url(https://user-gold-cdn.xitu.io/2020/4/8/17157e08859240d6?w=322&h=149&f=png&s=16439);
/* 分两步 */
animation: box3after .4s;
}
@keyframes box3after {
0% {
background-position: 0 0;
}
100% {
/* 整个图片的宽度 */
background-position: -322px 0;
}
}
.f4 .box4 {
width: 171px;
height: 157px;
animation-delay: 4.5s;
}
.box4::after {
width: 171px;
height: 157px;
background-image: url(https://user-gold-cdn.xitu.io/2020/4/8/17157e0d2d9f8e9b?w=342&h=157&f=png&s=15668);
/* 分两步 */
animation: box4after .4s;
}
@keyframes box4after {
0% {
background-position: 0 0;
}
100% {
/* 整个图片的宽度 */
background-position: -322px 0;
}
}
</style>
</head>
<body>
<div class="f4">
<div class="box1"></div>
<div class="box2"></div>
<div class="box3"></div>
<div class="box4"></div>
</div>
</body>
</html>
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>地图</title>
<style>
* {
margin: 0;
padding: 0;
}
body {
background-color: #333;
}
.map {
position: relative;
width: 747px;
height: 617px;
margin: 0 auto;
background: url(https://user-gold-cdn.xitu.io/2020/4/8/17157dbc721d5ce2?w=747&h=617&f=png&s=176409);
}
.map .city {
position: absolute;
top: 229px;
right: 192px;
}
.map .tb {
position: absolute;
top: 498px;
right: 79px;
}
.map .gz {
position: absolute;
top: 543px;
right: 193px;
}
.map .city .dotted {
width: 8px;
height: 8px;
background-color: #09f;
border-radius: 50%;
}
/* 选择div里面以pulse开头的元素 */
.map .city div[class^="pulse"] {
/* 让波纹在city中水平垂直居中 */
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 8px;
height: 8px;
/* 波纹设置阴影 */
box-shadow: 0 0 12px #009dfd;
border-radius: 50%;
/* 设置2s匀速循环播放 */
animation: pulse 1.2s linear infinite;
}
/* 让波纹更有层次感,设置每个波纹的开始时间不一样 */
/* 提权层叠 */
.map .city div.pulse2 {
animation-delay: .4s;
}
.map .city div.pulse3 {
animation-delay: .8s;
}
@keyframes pulse {
0% {}
50% {
width: 40px;
height: 40px;
opacity: 1;
}
100% {
width: 80px;
height: 80px;
opacity: 0;
}
}
</style>
</head>
<body>
<!-- 地图 -->
<div class="map">
<!-- 城市 -->
<div class="city">
<!-- 小点 -->
<div class="dotted"></div>
<!-- 波纹 -->
<div class="pulse1"></div>
<div class="pulse2"></div>
<div class="pulse3"></div>
</div>
<div class="city tb">
<!-- 小点 -->
<div class="dotted"></div>
<!-- 波纹 -->
<div class="pulse1"></div>
<div class="pulse2"></div>
<div class="pulse3"></div>
</div>
<div class="city gz">
<!-- 小点 -->
<div class="dotted"></div>
<!-- 波纹 -->
<div class="pulse1"></div>
<div class="pulse2"></div>
<div class="pulse3"></div>
</div>
</div>
</body>
</html>
原文:https://www.cnblogs.com/xiaoaitongxue/p/12658932.html