文章目录
一、transform(转换)
2D转换
2D转换是改变标签在二维平面上的位置和形状,你可以让元素向左右、上下移动。想要让这个2D效果动起来,需要结合过渡(transition)进行使用。
1. translate(移动)
translate(改变元素在页面中的位置
优点:不会影响其他元素的位置-对行内标签没有效果)
可跟%;相当于本身元素的高度和宽度50%就是50px
例:
<!DOCTYPE html>
<html>
<head>
<style>
div {
width: 300px;
height: 100px;
background-color: yellow;
border: 1px solid black;
-ms-transform: translate(50px,100px); /* IE 9 */
transform: translate(50px,100px); /* 标准语法 */
}
</style>
</head>
<body>
<h1>translate() 方法</h1>
<p>translate() 方法从元素当前位置对其进行移动:</p>
<div>
该 div 元素从其当前位置向右移动 50 个像素,并向下移动 100 个像素。
</div>
</body>
</html>
让盒子实现水平居中和垂直居中
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Document</title>
<style>
div {
position: relative;
width: 500px;
height: 500px;
background-color: pink;
/* 1. 我们tranlate里面的参数是可以用 % */
/* 2. 如果里面的参数是 % 移动的距离是 盒子自身的宽度或者高度来对比的 */
/* 这里的 50% 就是 50px 因为盒子的宽度是 100px */
/* transform: translateX(50%); */
}
p {
position: absolute;
top: 50%;
left: 50%;
width: 200px;
height: 200px;
background-color: purple;
/* margin-top: -100px;
margin-left: -100px; */
/* translate(-50%, -50%) 盒子往上走自己高度的一半 */
transform: translate(-50%, -50%);
}
span {
/* translate 对于行内元素是无效的 */
transform: translate(300px, 300px);
}
</style>
</head>
<body>
<div>
<p></p>
</div>
<span>123</span>
</body>
</html>
效果如下:
2. rotate(旋转)
2D旋转指的是让元素在二维平面内顺时针或者逆时针旋转
rotate 里面跟度数,单位是deg
角度为正时,顺时针,角度为负时,逆时针默认旋转的中心点是元素的中心点
<!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>CSS3旋转</title>
<link rel="stylesheet" href="./CSS/index.css">
</head>
<body>
<div class="div">
<ul>
<li>
<a href="" target="_blank">
<span>
<img src="./images/1.png" alt="">
</span>
<div class="next">
<h2>讲师介绍</h2>
</div>
</a>
</li>
<li>
<a href="" target="_blank">
<span>
<img src="./images/2.png" alt="">
</span>
<div class="next">
<h2>修改作业</h2>
</div>
</a>
</li>
<li>
<a href="" target="_blank">
<span>
<img src="./images/3.png" alt="">
</span>
<div class="next">
<h2>通过考试</h2>
</div>
</a>
</li>
<li>
<a href="" target="_blank">
<span>
<img src="./images/4.png" alt="">
</span>
<div class="next">
<h2>领取证书</h2>
</div>
</a>
</li>
</ul>
</div>
</body>
</html>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
background: #edecec;
font-family: "微软雅黑";
font-size: 14px;
}
.div {
width: 1200px;
margin: 100px auto 0;
background-color: #edecec;
}
li {
list-style: none;
}
a {
text-decoration: none;
text-align: center;
}
span {
width: 230px;
height: 100px;
display: block;
text-align: center;
margin-top: 35px;
transition: all 500ms linear;
}
img {
width: 70px;
height: 70px;
}
.div ul li {
overflow: hidden;
float: left;
width: 250px;
height: 250px;
border: 10px solid #f6f6f6;
border-radius: 50%;
background-color: #fff;
margin-right: 15px;
transition: all 500ms linear;
/* 过渡 持续时间 linear(规定从开始到结束具有相同速度的过渡效果)*/
}
.next {
text-align: center;
padding: 0 20px;
line-height: 28px;
transition: all 500ms linear;
color: #8b8b8b;
}
.div ul li a {
display: block;
width: 100%;
height: 100%;
}
/* 效果展示 */
.div ul li:hover {
width: 250px;
height: 250px;
background: #eeedeb;
transform: rotate(360deg);
/* 当鼠标触碰到li时,盒子旋转360度,同时背景颜色改变 */
}
.div ul li:hover span {
transform: scale(1.8, 1.8);
/* 鼠标放在li上的时候,盒子旋转的同时,img放大 */
}
.div ul li:hover .next {
color: #252525;
font-size: 20px;
/* 鼠标点到li时,在旋转的同时字体放大并改变颜色 */
}
效果如下:
3. scale(缩放)
用来控制元素的放大与缩小
最大的优势:可以设置转换中心点缩放,默认以中心点缩放,而且不影响其他盒子
例:
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
.nav {
width: 860px;
height: 450px;
margin: 100px auto;
background-color: #666666;
}
li {
list-style: none;
}
.nav ul li img {
display: block;
width: 255px;
height: 195px;
opacity: 0.5;
/* 透明度为0.5 */
}
.nav ul li {
overflow: hidden;
float: left;
margin-left: 25px;
margin-top: 20px;
cursor: pointer;
}
.nav ul li:hover img {
transform: scale(0.5);
opacity: 1;
transition: all 1s;
/* 当鼠标点到li时,img缩小到0.5倍,过渡持续时间为1s */
}
<!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>CSS3缩放</title>
<link rel="stylesheet" href="./CSS/index.css">
</head>
<body>
<div class="nav">
<ul>
<li>
<img src="./images/1.jpg" alt="">
</li>
<li>
<img src="./images/2.jpg" alt="">
</li>
<li>
<img src="./images/3.jpg" alt="">
</li>
<li>
<img src="./images/4.jpg" alt="">
</li>
<li>
<img src="./images/5.jpg" alt="">
</li>
<li>
<img src="./images/6.jpg" alt="">
</li>
</ul>
</div>
</body>
</html>
效果如下:
4. skew(倾斜)
使元素沿 X 和 Y 轴倾斜给定角度
<!DOCTYPE html>
<html>
<head>
<style>
div {
width: 300px;
height: 100px;
background-color: yellow;
border: 1px solid black;
}
div#myDiv {
-ms-transform: skew(20deg,10deg); /* IE 9 */
transform: skew(20deg,10deg); /* 标准语法 */
}
</style>
</head>
<body>
<h1>skew() 方法</h1>
<p>skew() 方法将元素倾斜到给定角度。</p>
<div>
这是一个普通的 div 元素。
</div>
<div id="myDiv">
该 div 元素沿 X 轴倾斜 20 度,沿 Y 轴倾斜 10 度。
</div>
</body>
</html>
注意:
- 同时使用多个转换,其格式为
transform: translate() rotate() scale()
- 顺序会影响到转换的效果(先旋转会改变坐标轴方向)
- 但我们同时有位置或者其他属性的时候,要将位移放到最前面
3D转换
- x 轴:水平向右 – 注意:x 轴右边是正值,左边是负值
- y 轴:垂直向下 – 注意:y 轴下面是正值,上面是负值
- z 轴:垂直屏幕 – 注意:往外边的是正值,往里面的是负值
1. translate3d(移动)
3D
移动就是在 2D
移动的基础上多加了一个可以移动的方向,就是 z 轴方向
注意:x, y, z 对应的值不能省略,不需要填写用 0 进行填充
语法:
transform: translate3d(x, y, z)
2.rotate3d(旋转)
左手准则:
- 左手的拇指指向 y 轴的正方向
- 其余的手指弯曲方向就是该元素沿着 y 轴旋转的方向(正值)
旋转指可以让元素在三维平面内沿着 x 轴、y 轴、z 轴 或者自定义轴进行旋转
transform: rotateX(45deg)
– 沿着 x 轴正方向旋转 45 度transform: rotateY(45deg)
– 沿着 y 轴正方向旋转 45 度transform: rotateZ(45deg)
– 沿着 z 轴正方向旋转 45 度transform: rotate3d(x, y, z, 45deg)
– 沿着自定义轴旋转 45 deg 为角度
<!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>
.box {
width: 300px;
height: 300px;
margin: 100px auto;
position: relative;
transition: all 2s;
transform-style: preserve-3d;
}
.box:hover {
cursor: pointer;
transform: rotateY(180deg);
}
.front,
.back {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
border-radius: 50%;
font-size: 30px;
color: #fff;
text-align: center;
line-height: 300px;
}
.front {
background-color: pink;
z-index: 1;
}
.back {
background-color: green;
transform: rotateY(180deg);
}
</style>
</head>
<body>
<div class="box">
<div class="front">熙熙攘攘</div>
<div class="back">华灯初上</div>
</div>
</body>
</html>
效果图如下:
透视-perspective(产生3D效果)
写在被观察元素的父元素上 透视越小,画面越大
- d:就是视距,视距就是指人的眼睛到屏幕的距离
- z:就是 z 轴,z 轴越大(正值),我们看到的物体就越大
3D呈现 transfrom-style
- 控制子元素是否开启三维立体环境
transform-style: flat
代表子元素不开启3D
立体空间,默认的transform-style: preserve-3d
子元素开启立体空间- 代码写给父级,但是影响的是子盒子
例:
<div class="box">
<div></div>
<div></div>
</div>
<style>
/* div {
width: 100px;
height: 100px;
border-color: pink;
/* transform: translateX(100px) translateY(100px) translateZ(100px);
transform: translate3d(100px, 100px, 100px);
} */
body {
perspective: 500px;
}
.box {
width: 200px;
height: 200px;
margin: 100px auto;
position: relative;
transition: all 1s;
transform-style: preserve-3d;
}
.box:hover {
transform: rotateY(60deg);
}
.box div {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: pink;
}
.box div:last-child {
transform: rotateX(60deg);
background-color: purple;
}
</style>
二、animation(动画)
1.什么是动画
动画是 CSS3
中最具颠覆性的特征之一,可通过设置多个节点来精确的控制一个或者一组动画,从而实现复杂的动画效果
2.动画的使用
- 先定义动画
- 在调用定义好的动画
2.1语法格式(定义动画)
@keyframes 动画名称 {
0% {
width: 100px;
}
100% {
width: 200px
}
}
2.2语法格式(使用动画)
div {
/* 调用动画 */
animation-name: 动画名称;
/* 持续时间 */
animation-duration: 持续时间;
}
动画序列:
- 0% 是动画的开始,100 % 是动画的完成,这样的规则就是动画序列
- 在 @keyframs 中规定某项 CSS 样式,就由创建当前样式逐渐改为新样式的动画效果
- 动画是使元素从一个样式逐渐变化为另一个样式的效果,可以改变任意多的样式任意多的次数
- 用百分比来规定变化发生的时间,或用
from
和to
,等同于 0% 和 100%
2.3animation属性
3.效果展示
代码:
<!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>阴阳师f4</title>
<link rel="stylesheet" href="./css/index.css">
</head>
<body>
<div class="f4_box">
<div class="wek01">
<div class="wek_1"></div>
</div>
<div class="wek02">
<div class="wek_2"></div>
</div>
<div class="wek03">
<div class="wek_3"></div>
</div>
<div class="wek04">
<div class="wek_4"></div>
</div>
</div>
</body>
</html>
* {
padding: 0;
margin: 0;
box-sizing: border-box;
}
.f4_box {
position: fixed;
width: 100%;
height: 180px;
left: 0;
bottom: 0;
z-index: 99;
transition: all 2.3s ease;
}
.wek01 {
position: absolute;
bottom: 0;
left: 0;
opacity: 0;
width: 154px;
height: 121px;
animation: wek01 15s linear infinite;
}
.wek_1 {
width: 154px;
height: 121px;
background: url(../images/txgc_6d0e9e5.png) no-repeat;
animation: wek_1 .4s steps(2) infinite;
}
@keyframes wek_1 {
0% {
background-position: 0 0;
}
100% {
background-position: -308px 0;
}
}
@keyframes wek01 {
0% {
transform: translate(-200px, 0);
opacity: 1;
}
100% {
transform: translate(1920px, 0);
opacity: 1;
}
}
.wek02 {
position: absolute;
bottom: 0;
left: 0;
opacity: 0;
width: 165px;
height: 175px;
animation: wek02 15s linear 2s infinite;
/* 这里的2s是指在前面一个盒子走了2s之后在开始移动 */
}
.wek_2 {
width: 165px;
height: 175px;
background: url(../images/txgh_fee2457.png) no-repeat;
animation: wek_2 .4s steps(2) infinite;
}
@keyframes wek_2 {
0% {
background-position: 0 0;
}
100% {
background-position: -334px 0;
}
}
@keyframes wek02 {
0% {
transform: translate(-200px, 0);
opacity: 1;
}
100% {
transform: translate(1920px, 0);
opacity: 1;
}
}
.wek03 {
position: absolute;
bottom: 0;
left: 0;
opacity: 0;
width: 180px;
height: 142px;
animation: wek03 15s linear 4s infinite;
/* 这里的2s是指在前面一个盒子走了4s之后在开始移动 */
}
.wek_3 {
width: 180px;
height: 142px;
background: url(../images/txgl_c15cfd8.png) no-repeat;
animation: wek_3 .4s steps(2) infinite;
}
@keyframes wek_3 {
0% {
background-position: 0 0;
}
100% {
background-position: -334px 0;
}
}
@keyframes wek03 {
0% {
transform: translate(-200px, 0);
opacity: 1;
}
100% {
transform: translate(1920px, 0);
opacity: 1;
}
}
.wek04 {
position: absolute;
bottom: 0;
left: 0;
opacity: 0;
width: 166px;
height: 155px;
animation: wek04 15s linear 6s infinite;
/* 这里的2s是指在前面一个盒子走了6s之后在开始移动 */
}
.wek_4 {
width: 166px;
height: 155px;
background: url(../images/txgq_d281c9b.png) no-repeat;
animation: wek_4 .4s steps(2) infinite;
}
@keyframes wek_4 {
0% {
background-position: 0 0;
}
100% {
background-position: -334px 0;
}
}
@keyframes wek04 {
0% {
transform: translate(-200px, 0);
opacity: 1;
}
100% {
transform: translate(1920px, 0);
opacity: 1;
}
}
效果如下: