从零开始学前端:程序猿小白也可以完全掌握!—今天你学习了吗?(CSS)
复习:从零开始学前端:过渡和动画 — 今天你学习了吗?(CSS:Day20)
前言
快赶上进度了,不过每天除了作业还有别的事情,,之前的学的不扎实,练习也没有独立思考着做。发愁,继续追赶吧。
第二十一节课:形变
一、什么是形变
属于2D/3D上的转换、变形效果。他不是一个动画,他就是变形。比如正方形变平行四边形,再变圆形。都是形状变成另一个形状。但是如果配合上transition/animation,他就会从一个形状变成另一形状。只要有一段时间内的过渡效果,就形成了动画。变形就是通过CSS来改变元素的形状。
使用transform属性来设置元素的变形效果,里面的属性都可以为负数。
其中transform-origin属性确定形变的原点。【transform-origin:0px 0px;】------下面缩放实例有用到
CSS转换(transform)允许您移动、旋转、缩放和倾斜元素。(我们在这里主要给大家介绍这三种)
- 位置:位移translate(X,Y);
- 大小:缩放scale(XX);
- 旋转 router(xx deg);
二、形变的位移属性
- transform:translateX()【沿着X轴方向平移】
- transform:translateY()【沿着Y轴方向平移】
- transform:translateZ()【沿着Z轴方向平移】
注意点:
- 当我们使用形变位移的时候,如果需要朝两个不同的方向移动,那么这两个方向不能分开写,只能合并写(transform:translateX() translateY())。或者transform:translate(X,Y)。
- 我们形变位移只能位移块元素或者行内块元素。
- 当translate的值为百分数的时候,它的百分比是根据自身。
- 并且位移之后,元素还是占着原来的位置的。(有点像相对定位,原本位置在,但是看似走了。形象比喻:本体还在,魂飞了,但是只能看到魂魄)
- 通常使用在页面中鼠标移动上去的效果。
transform:translate(Z)【沿着Z轴方向平移】
Z轴平移,调整Z轴的位置,正常情况下,就调整元素和人眼的距离。【距离越大,元素离人越近,元素就看着越大,实际上元素的实际大小不变】
Z轴平移属于立体效果(近大远小),默认情况下网页是不支持透视,如果需要看的见效果,必须给网页body设置视距(perspective),视距单位使用的是px像素。(需要3d效果的展示,就需要视距)
实例:
原图:
X轴:
Y轴:
Z轴(注意加perspective,不然看不到效果):
代码:
<!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;
}
.box{
width: 200px;
height: 200px;
background-color: pink;
border: 5px solid skyblue;
margin: 50px auto;
overflow: hidden;
transition: .5s;
}
.box:hover {
transform: translateX(20px);
transform: translateY(20px);
transform: translateZ(100px);
}
</style>
</head>
<body>
<div class="box">
</div>
</body>
</html>
三、形变的缩放属性
scaleX(2):【水平方向缩放】
scaleY(2):【垂直方向缩放】
scale(2,2):双向缩放
注意点:
- scale缩放都是成倍数缩放的,所以里面的属性值不能加上单位。
- 当属性值小于1的时候,就是缩小。
实例:
原图:
缩放:
代码:
<!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: 200px;
height: 200px;
background-color: pink;
border: 5px solid skyblue;
margin: 50px auto;
overflow: hidden;
}
.box:hover img{
/* transform: scaleX(.5); */
/* transform: scaleY(.5); */
transform: scale(1.2);
}
img{
width: 200px;
transition: 1s;
transform-origin: 0 0;
}
</style>
</head>
<body>
<div class="box">
<img src="../../img素材/回眸.jpg" alt="">
</div>
</body>
</html>
四、形变的旋转属性
rotateX:【X轴方向旋转】
rotateY:【Y轴方向旋转】
rotateZ:【Z轴方向旋转】
rotate() 旋转 元素顺时针旋转给定的角度。允许负值,元素将逆时针旋转,单位是deg。(1turn表示一圈)
实例1:
原图:
X轴旋转:
Y轴旋转:
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: 800px;
}
.box {
width: 200px;
height: 200px;
background-color: pink;
border: 5px solid skyblue;
margin: 50px auto;
overflow: hidden;
transition: 1s;
}
.box:hover {
transform: rotateX(45deg);
transform: rotateY(45deg);
transform: rotateZ(45deg);
}
</style>
</head>
<body>
<div class="box">
</div>
</body>
</html>
实例2:
原图:
旋转:
https://www.bilibili.com/video/BV1o34y1r72Z/
代码:
<!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;
}
.box {
width: 200px;
height: 200px;
background-color: pink;
border: 5px solid skyblue;
margin: 100px auto;
overflow: hidden;
/* linear:匀速运动 */
/* infinite:一直不停的转动 */
animation: run 2s linear infinite;
}
@keyframes run {
/*
0% {
transform: rotateY(0);
}
100% {
transform: rotateZ(360deg);
} */
from {
transform: rotateX(0) rotateY(0) rotateZ(0);
}
to {
transform: rotateX(1turn) rotateY(1turn) rotateZ(1turn);
}
}
</style>
</head>
<body>
<div class="box">
</div>
</body>
</html>
五、练习
双层3d盒子旋转:
提示:
一层盒子旋转:
效果:
https://www.bilibili.com/video/BV1qq4y1x7AN/
代码:
<!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>3D盒子旋转</title>
<style>
.contain {
/* perspective: 800px; */
height: 200px;
width: 200px;
margin: 200px auto;
position: relative;
animation: girl 5s linear infinite;
transform-style: preserve-3d;
}
.contain .box {
width: 200px;
height: 200px;
position: absolute;
overflow: hidden;
}
.contain .box>img {
width: 200px;
/* opacity: .6; */
}
.box1 {
transform: rotateY(90deg) translateZ(100px);
}
.box2 {
transform: rotateY(-90deg) translateZ(100px);
}
.box3 {
transform: rotateX(90deg) translateZ(100px);
}
.box4 {
transform: rotateX(-90deg) translateZ(100px);
}
.box5 {
transform: rotateY(180deg) translateZ(100px);
}
.box6 {
transform: translateZ(100px);
}
@keyframes girl {
from {
transform: rotateX(0) rotateY(0) rotateZ(0);
}
to {
transform: rotateX(180deg) rotateY(180deg) rotateZ(180deg);
}
}
</style>
</head>
<body>
<div class="contain">
<div class="box box1">
<img src="./girl/1.jpg" alt="">
</div>
<div class="box box2">
<img src="./girl/2.jpg" alt="">
</div>
<div class="box box3">
<img src="./girl/3.jpg" alt="">
</div>
<div class="box box4">
<img src="./girl/4.jpg" alt="">
</div>
<div class="box box5">
<img src="./girl/5.png" alt="">
</div>
<div class="box box6">
<img src="./girl/6.jpg" alt="">
</div>
</div>
</body>
</html>
请仿照此例子做出双层3d模型:
效果:https://www.bilibili.com/video/BV1aT4y1i7KF/
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>3D盒子旋转</title>
<style>
.contain {
/* perspective: 800px; */
height: 300px;
width: 300px;
margin: 150px auto;
position: relative;
/* background-color: pink; */
animation: girl 5s linear infinite;
/* 3D结构 */
transform-style: preserve-3d;
}
.contain1 {
height: 150px;
width: 150px;
position: absolute;
animation: cutegirl 5s linear infinite;
/* 3D结构 */
transform-style: preserve-3d;
top: 75px;
left: 75px;
}
.contain1 .box {
margin: 0;
width: 150px;
height: 150px;
position: absolute;
overflow: hidden;
}
.contain1 .box>img {
width: 150px;
/* opacity: .6; */
}
.contain .boxg {
margin: 0;
width: 300px;
height: 300px;
position: absolute;
overflow: hidden;
}
.contain .boxg>img {
width: 300px;
/* opacity: .6; */
}
.box1 {
transform: rotateY(90deg) translateZ(75px);
}
.box2 {
transform: rotateY(-90deg) translateZ(75px);
}
.box3 {
transform: rotateX(90deg) translateZ(75px);
}
.box4 {
transform: rotateX(-90deg) translateZ(75px);
}
.box5 {
transform: rotateY(180deg) translateZ(75px);
}
.box6 {
transform: translateZ(75px);
}
.boxg1 {
transform: rotateY(90deg) translateZ(150px);
}
.boxg2 {
transform: rotateY(-90deg) translateZ(150px);
}
.boxg3 {
transform: rotateX(90deg) translateZ(150px);
}
.boxg4 {
transform: rotateX(-90deg) translateZ(150px);
}
.boxg5 {
transform: rotateY(180deg) translateZ(150px);
}
.boxg6 {
transform: translateZ(150px);
}
@keyframes cutegirl {
from {
transform: rotateX(0) rotateY(0) rotateZ(0);
}
to {
transform: rotateX(-180deg) rotateY(-180deg) rotateZ(-180deg);
}
}
@keyframes girl {
from {
transform: rotateX(0) rotateY(0) rotateZ(0);
}
to {
transform: rotateX(180deg) rotateY(180deg) rotateZ(180deg);
}
}
.contain:hover .boxg1 {
transform: rotateY(90deg) translateZ(300px);
}
.contain:hover .boxg2 {
transform: rotateY(-90deg) translateZ(300px);
}
.contain:hover .boxg3 {
transform: rotateX(90deg) translateZ(300px);
}
.contain:hover .boxg4 {
transform: rotateX(-90deg) translateZ(300px);
}
.contain:hover .boxg5 {
transform: rotateY(180deg) translateZ(300px);
}
.contain:hover .boxg6 {
transform: translateZ(300px);
}
</style>
</head>
<body>
<div class="contain">
<div class="contain1">
<div class="box box1">
<img src="./cutegirl/c1.jpg" alt="">
</div>
<div class="box box2">
<img src="./cutegirl/c2.jpg" alt="">
</div>
<div class="box box3">
<img src="./cutegirl/c3.jpg" alt="">
</div>
<div class="box box4">
<img src="./cutegirl/c4.jpg" alt="">
</div>
<div class="box box5">
<img src="./cutegirl/c5.jpg" alt="">
</div>
<div class="box box6">
<img src="./cutegirl/c6.jpg" alt="">
</div>
</div>
<div class="boxg boxg1">
<img src="./girl/1.jpg" alt="">
</div>
<div class="boxg boxg2">
<img src="./girl/2.jpg" alt="">
</div>
<div class="boxg boxg3">
<img src="./girl/3.jpg" alt="">
</div>
<div class="boxg boxg4">
<img src="./girl/4.jpg" alt="">
</div>
<div class="boxg boxg5">
<img src="./girl/5.png" alt="">
</div>
<div class="boxg boxg6">
<img src="./girl/6.jpg" alt="">
</div>
</div>
</body>
</html>
预习:从零开始学前端:css3新属性scss和less — 今天你学习了吗?(CSS:Day22)
------岁去弦吐箭。