从零开始学前端:形变 --- 今天你学习了吗?(Day21)
从零开始学前端:程序猿小白也可以完全掌握!—今天你学习了吗?(Day21)
复习:从零开始学前端:过渡和动画 — 今天你学习了吗?(Day20)
文章目录
- 从零开始学前端:程序猿小白也可以完全掌握!—今天你学习了吗?(Day21)
-
- 前言
- 第二十一节课:形变
-
- 一、什么是形变
- 二、形变的位移属性
- 三、形变的缩放属性
- 四、形变的旋转属性
- 五、练习
前言
快赶上进度了,不过每天除了作业还有别的事情,,之前的学的不扎实,练习也没有独立思考着做。发愁,继续追赶吧。
第二十一节课:形变
一、什么是形变
属于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模型:
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 — 今天你学习了吗?(Day22)
------岁去弦吐箭。