十、3D

十、 3D

2d是平面

1
2
3
2d的坐标系: x + y
x: 正方向向右  
y: 正方向向下

3d是立体

1
2
3
4
3d的坐标系: x + y + z
x: 正方向向右
y: 正方向向下
z: 垂直于屏幕

10.1 translateZ

该属性是transform的一个子属性,表示元素沿着自身坐标系z轴移动多少像素

1
2
3
<div id="box">
<img src="./碎片轮播图/imgs/0.jpg" alt="">
</div>
1
2
3
4
5
img {
width: 400px;
/* 图片在Z轴上移动的距离 */
transform: translateZ(100px);
}

但是只有该条语句的时候, 将没有任何效果

U8A90K.png

要给父元素添加perspective: xxpx

表示,此时元素距离屏幕的距离

举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/* 父元素 */
#box {
width: 400px;
height: 300px;
margin: 50px auto;
border: 1px solid #000;
background-color: red;
/* 父元素里屏幕的距离1000px */
perspective: 1000px;
}

/* 子元素 */
img {
width: 400px;
/* 表示子元素从距离屏幕1000px的位置移动到距离屏幕900px的位置 相当于放大图片 */
transform: translateZ(100px);
}

U8AeXt.png

所以,当只有一个translateZ属性的时候, 浏览器不知道该以什么样的形式变化
所以,必须给父元素添加perspective属性,使父元素和子元素之间有一个相对距离的比值

10.2 perspective

景深:

决定元素到屏幕的距离

举例:

1
2
3
4
5
6
7
8
9
10
 /* 父元素 */
#box {
width: 400px;
height: 400px;
margin: 0 auto;
border: 1px solid #000;
background-color: red;
/* 确定舞台的距离 */
perspective: 1000px;
}

10.3 transform-style: perserve-3d

U8AhND.png

作用:

让子元素保留3d效果

1
2
3
4
5
<div id="div1">
<div id="div2">
<div id="div3"></div>
</div>
</div>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#div1 {
position: relative;
width: 300px;
height: 300px;
margin: 0 auto;
border: 1px solid #000;
}
#div2 {
position: absolute;
width: 200px;
height: 250px;
margin: 10px;
background-color: red;
}
#div3 {
position: absolute;
width: 250px;
height: 200px;
margin: 10px;
background-color: lightblue;
}

U8A7jI.png

div2添加 transform: rotateY(60deg);

div3添加 transform: rotateX(-60deg);

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#div2 {
position: absolute;
width: 200px;
height: 250px;
margin: 10px;
background-color: red;
transform: rotateY(60deg);
}
#div3 {
position: absolute;
width: 250px;
height: 200px;
margin: 10px;
background-color: lightblue;
transform: rotateX(-60deg);
}

U8Av4g.png

div2添加transform-style: preserve-3d;

1
2
3
4
5
6
7
8
9
#div2 {
position: absolute;
width: 200px;
height: 250px;
margin: 10px;
background-color: red;
transform: rotateY(60deg);
transform-style: preserve-3d;
}

U8EEUU.png

10.4 scaleZ

U8uDZn.png

scale是缩放的意思,一个元素只有高度和宽度没有厚度的概念,所以给一个元素添加scaleZ是没有意义的

给一个具备立体样式容器元素添加scaleZ,将体现在该元素的子元素身上

举例:

U8ujLd.png

接下来, 我们把该元素变为具备立体样式的容器元素:

1
2
3
4
5
6
7
8
<div>   
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>

U8Kymd.png

综合结论:

当给一个元素添加scaleZ是没有意义的, 只有当一个元素成为有立体样式的容器元素的时候,此时添加scaleZ,将体现在子元素身上

10.5 backface-visibility

U8KWff.png

默认情况下图片背面是可见状态

backface-visibility:visible; (默认值)

U8MC7R.png

加上backface-visibility: hidden

图片的背面被隐藏

10.6 改变旋转轴中心

U8Meje.png

  • transform-origin: 接受两个参数

    • 可以是单词法

    • 可以是像素法

    • 可以百分比

    • 默认是 50% 50%

U8MQAI.png

改变旋转轴中心为左上角

1
2
3
4
5
img {
/*改变旋转中心为左上角*/
transform-origin: left top;
transform: rotateZ(45deg);
}

U8M14P.png

改变旋转轴中心到 50px 50px的位置:

1
2
3
4
img {
/*transform-origin: 50px 50px;*/
transform: rotateZ(45deg);
}

U8M89f.png

改变旋转轴中心到右侧中间部分:

1
2
3
4
5
img {
/*改变旋转轴中心*/
transform-origin: 100% 50%;
transform: rotateZ(45deg);
}

U8MjUI.png

点击查看

本文标题:十、3D

文章作者:Mango

发布时间:2020年07月14日 - 13:12:52

最后更新:2020年07月14日 - 13:27:10

原始链接:https://mango185.github.io/post/753f2219.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

-------------------本文结束 感谢您的阅读-------------------