04-动画

1.动画概述

可通过设置多个节点来精确的控制一个或者一组动画,从而实现复杂的动画效果。

2.语法

1.0%是动画的开始可以用from替代,100%是动画的完成可用to替代。

2.在CSS中用@keyframes中定义动画的样式,在用选择器调用animation调用动画

3.动画是是元素从一种样式逐渐变化成另一种样式的效果。可以任意改变动画节点。

@keyframes 动画名称 {
	0%{
		初始状态属性
	}
	100%{
		结束状态属性
	}
}

div {
	<!--调用动画-->
	animation-name:动画名称;
	<!--动画持续时间-->
	animation-duration:time;
}

3.用法

        @keyframes move {

            /* 初始状态 */
            0% {
                transform: translate(0, 0);
            }

            /* 结束状态 */
            100% {
                transform: translate(1200px, 0);
            }
        }
        .box1 {
            background-color: #f34;
            /* 调用动画名称 */
            animation-name: move;
            /* 动画持续时间 */
            animation-duration: 3s;
        }

4.多个动画序列用法

        @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;
        }

4.1总结

1.根据动画的时间,用百分比控制多个节点的动画状态。

2.节点的百分比必须是整数。

3.动画中的移动位置始终是相对于元素的初始位置。

5.动画属性

1583597076672.png

        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;
        }

5.1动画属性简写

        .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;
        }

5.2总结

1.动画属性name和duration必写,其余的不写就是默认值。

2.动画属性简写除了动画时间和何时开始以外没有顺序之分。只有一个时间时,就是运动时间,何时开始取默认值0;有两个时间时,第一个时间必是运动时间,第二个是何时开始。

3.运动是否暂停不包含在简写范围内,需要搭配:hover使用。

5.3动画运动曲线属性

1583597047641.png

       .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;
        }

6.动画库调用动画

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>

7.案例

1.时钟

<!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>

2. 风车

<!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>

3.加载

<!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>

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>
    <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>

5.地图

<!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>

猜你喜欢

转载自www.cnblogs.com/xiaoaitongxue/p/12658932.html