一、动画
1、0%是动画的开始,100%是动画的完成,这样的规则就是动画序列。或者用关键词"from"和"to",等同于0%和100%。
2、里面的百分比要是整数。
3、里面的百分比就是总的时间的划分。
4、在@keyframes中规定某项CSS样式,就能创建由当前样式逐渐改为新样式的动画效果。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 第一步 定义动画 */
@keyframes move {
0% {
transform: translate(0, 0);
}
25% {
transform: translate(1000px, 0);
}
50% {
transform: translate(1000px, 500px);
}
75% {
transform: translate(0, 500px);
}
100% {
transform: translate(0, 0);
}
}
div {
width: 100px;
height: 100px;
background-color: pink;
/* 第二步 使用动画 */
/* 动画名称 */
animation-name: move;
/* 动画时间 */
animation-duration: 10s;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
5、动画属性
属性 | 描述 |
@keyframes | 规定动画 |
animation | 所有动画属性的简写,除了animation-play-state属性 |
animation-name | 规定@keyframes动画的名称(必须) |
animation-duration | 规定动画完成一个周期所花费的秒或毫秒,默认为0(必须) |
animation-timing-function | 规定动画的速度曲线,默认是"ease" |
animation-delay | 规定动画何时开始,默认是0 |
animation-iteration-count | 规定动画被播放的次数,默认是1,infinite无限 |
animation-direction | 规定动画是否在下一周期逆向播放,默认是"normal",alternate逆播放 |
animation-play-state | 规定动画是否正在运行或暂停,默认是"running",还有"paused" |
animation-fill-mode | 规定动画结束后状态,保持forwards 回到起点backwards |
animation | 动画名称 持续时间 动画曲线 何时开始 播放次数 是否反方向 动画起始或结束状态 注意:简写属性里面不包含animation-play-state |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
@keyframes move {
0% {
transform: translate(0, 0);
}
100% {
transform: translate(1000px, 0);
}
}
div {
width: 100px;
height: 100px;
background-color: pink;
/* 动画名称 */
animation-name: move;
/* 持续时间 */
animation-duration: 2s;
/* 运动曲线 */
animation-timing-function: ease;
/* 何时开始 */
animation-delay: 1s;
/* 重复次数 */
/* animation-iteration-count: infinite; */
/* 是否反方向播放 */
/* animation-direction: alternate; */
/* 动画结束后的状态 */
animation-fill-mode: forwards;
/*简写 前两个属性是一定要写的*/
animation: move 2s linear 2s 1 alternate forwards;
}
div:hover {
/* 鼠标经过div 让div停止动画 鼠标离开就继续动画 */
animation-play-state: paused;
}
</style>
</head>
<body>
<div></div>
</body>
</html>
利用动画属性实现波纹效果:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
/* 实现波纹效果 */
.map {
position: relative;
width: 747px;
height: 616px;
background-color: pink;
margin: 0 auto;
}
.city {
position: absolute;
top: 227px;
right: 193px;
color: #fff;
}
.dotted {
width: 8px;
height: 8px;
background-color: #09f;
border-radius: 50%;
}
.city div[class^="pulse"] {
/* 保证我们小波纹在父盒子里面水平垂直居中 放大之后就会中心向四周发散 */
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
width: 8px;
height: 8px;
box-shadow: 0 0 12px #009dfd;
border-radius: 50%;
animation: pulse 1.2s linear infinite;
}
.city div.pulse2 {
animation-delay: 0.4s;
}
.city div.pulse3 {
animation-delay: 0.8s;
}
@keyframes pulse {
0% {}
70% {
/* 这里不用scale的原因是它会让阴影变大 */
/* transform: scale(5); */
width: 40px;
height: 40px;
opacity: 1;
}
100% {
width: 70px;
height: 70px;
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>
</body>
</html>
6、animation-timing-function
规定动画的速度曲线,默认是"ease"
属性值 | 描述 |
linear | 动画从头到尾的速度是相同的,匀速 |
ease | 默认。动画以低速开始,然后加快,在结束前放慢 |
ease-in | 动画以低速开始 |
ease-out | 动画以低速结束 |
ease-in-out | 动画以低速开始和结束 |
steps() | 指定了时间函数中的间隔数量(步长) |
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 0;
height: 30px;
background-color: pink;
/* steps就是分几步来完成我们的动画 */
animation: w 6s steps(10) infinite;
}
@keyframes w {
0% {
width: 0;
}
100% {
width: 200px;
}
}
</style>
</head>
<body>
<div></div>
</body>
</html>
二、3D转换之3D移动 translate3d
需要注意的是translateZ后面的单位我们一般跟px。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
div {
width: 200px;
height: 200px;
background-color: pink;
/* translate3d里面的xyz是不能省略的,如果没有就写0 */
transform: translate3d(50%, 50%, 100px);
}
</style>
</head>
<body>
<div></div>
</body>
</html>
三、3D转换之透视perspective
透视我们也称为视距,就是人的眼睛到屏幕的距离。距离视觉点越近的在电脑平面成像越大,越远成像越小。透视的单位是像素。
透视写在被观察元素的父盒子上面。
d:视距,就是人眼到屏幕的距离。
z:就是z轴,物体距离屏幕的距离,z轴越大(正值)我们看到的物体就越大。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
/* 透视写在被观察元素的父盒子上面 */
perspective: 500px;
}
div {
width: 200px;
height: 200px;
background-color: pink;
/* translate3d里面的xyz是不能省略的,如果没有就写0 */
transform: translate3d(500px, 500px, 100px);
}
</style>
</head>
<body>
<div></div>
</body>
</html>
四、3D转换之旋转rotate3d
1、语法:
rotateX(45deg):沿着x轴正方向旋转45度
rotateY(45deg):沿着y轴正方向旋转45度
rotateZ(45deg):沿着z轴正方向旋转45度
rotate(x,y,z,deg):沿着自定义方向旋转
2、左手准则:
rotateX():左手的大拇指指向x轴的正方向,其余手指的弯曲方向就是该元素沿着x轴正方向旋转的方向。
rotateY():左手的大拇指指向y轴的正方向,其余手指的弯曲方向就是该元素沿着y轴正方向旋转的方向。
rotateZ():同样的,左手的大拇指指向z轴的正方向,其余手指的弯曲方向就是该元素沿着z轴正方向旋转的方向。
五、3D呈现 transform-style
控制子元素是否开启三维立体环境。代码写给父级,但是影响的是子盒子。
transform-style:flat | 子元素不开启3d立体空间,默认 |
transform-style:preserve-3d | 子元素开启立体空间 |
3D导航栏案例
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
* {
margin: 0;
padding: 0;
}
ul {
margin: 100px;
}
ul li {
float: left;
width: 120px;
height: 35px;
margin: 0 5px;
list-style: none;
perspective: 500px;
}
.box {
position: relative;
width: 100%;
height: 100%;
transform-style: preserve-3d;
transition: all .4s;
}
.box:hover {
transform: rotateX(90deg);
}
.front,
.bottom {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
text-align: center;
line-height: 35px;
}
.front {
background-color: pink;
z-index: 1;
transform: translateZ(17.5px);
}
.bottom {
background-color: purple;
/* 如果有移动和其他样式 必须先写移动 */
transform: translateY(17.5px) rotateX(-90deg);
}
</style>
</head>
<body>
<ul>
<li>
<div class="box">
<div class="front">汪苏泷</div>
<div class="bottom">万有引力</div>
</div>
</li>
<li>
<div class="box">
<div class="front">张韶涵</div>
<div class="bottom">隐形的翅膀</div>
</div>
</li>
<li>
<div class="box">
<div class="front">汪苏泷</div>
<div class="bottom">有点甜</div>
</div>
</li>
<li>
<div class="box">
<div class="front">张碧晨</div>
<div class="bottom">年轮</div>
</div>
</li>
<li>
<div class="box">
<div class="front">王靖雯</div>
<div class="bottom">说说话</div>
</div>
</li>
</ul>
</body>
</html>
旋转木马案例:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<style>
body {
perspective: 800px;
}
section {
position: relative;
width: 300px;
height: 200px;
margin: 150px auto;
transform-style: preserve-3d;
animation: rotate 10s linear infinite;
}
section:hover {
animation-play-state: paused;
}
@keyframes rotate {
0% {
transform: rotateY(0);
}
100% {
transform: rotateY(360deg);
}
}
section div {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: url(media/yuner1.jpeg) no-repeat;
}
section div:nth-child(1) {
transform: rotateY(0) translateZ(300px);
}
section div:nth-child(2) {
/* 因为是旋转60度,这个必须先旋转,再移动 */
transform: rotateY(60deg) translateZ(300px);
}
section div:nth-child(3) {
/* 因为是旋转60度,这个必须先旋转,再移动 */
transform: rotateY(120deg) translateZ(300px);
}
section div:nth-child(4) {
/* 因为是旋转60度,这个必须先旋转,再移动 */
transform: rotateY(180deg) translateZ(300px);
}
section div:nth-child(5) {
/* 因为是旋转60度,这个必须先旋转,再移动 */
transform: rotateY(240deg) translateZ(300px);
}
section div:nth-child(6) {
/* 因为是旋转60度,这个必须先旋转,再移动 */
transform: rotateY(300deg) translateZ(300px);
}
</style>
</head>
<body>
<section>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</section>
</body>
</html>