平面转换与3D模型

355 阅读3分钟
一.空间转换(transform)

使用transform属性实现在空间内的位移、旋转、缩放等效果

(1) 空间:是从坐标轴角度定义的。 x 、y 和z三条坐标轴构成了一个立体空间,z轴位置与视线方向相同(x轴正方向向右,y轴正方向向下,z轴正方向向后,即为靠近自己的方向)。

(2) 空间转换也叫3D转换

(3)属性:transform

注意事项:transform属性同一个类里不能同时出现两行,否则会出现覆盖现象。

1.空间位移

语法

(1)transform: translate3d(x, y, z);

(2)transform: translateX(值);

(3)transform: translateY(值);

(4)transform: translateZ(值);

取值(正负均可)

(1)像素单位数值

(2)百分比(相对于自身的长度的百分比)

    <style>
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
        }
        body {
            /* 
            视距 一般随意的设置1000 
            一般给父元素添加  
            */
            perspective: 1000px;
        }
        div {
            width: 300px;
            height: 300px;
            background-color: pink;
            background-image: url("../day01/images/258f8d4142885c10.jpg.jpg");
            background-size: contain;
            /* transform: translate3d(100px,100px,100px); */
            margin: 100px auto;
            /* transform: rotateY(60deg); */
            /* transform: rotateZ(60deg); */
            /* transform: rotateX(60deg); */
            transform: rotate3d(1,1,1,60deg);
        }
    </style>
</head>
<body>
    <div>空间位移</div>
</body>
</html>
2.透视 (perspective)

目标:使用perspective属性实现透视效果 (实现视觉上的3D效果,实际上未能使子元素真正处于3D空间)

(1)思考:生活中,同一个物体,观察距离不同,视觉上有什么区别?

答:近大远小、近清楚远模糊

(2)思考:默认情况下,为什么无法观察到Z轴位移效果?

答:Z轴是视线方向,移动效果应该是距离的远或近, 电脑屏幕是平面,默认无法观察远近效果

1.属性(添加给父级)

perspective: 值;

2.取值:像素单位数值, 数值一般在800 – 1200。

3.作用

空间转换时,为元素添加近大远小、近实远虚的视觉效果

        body {
            /* 
            视距 一般随意的设置1000 
            一般给父元素添加  
            */
            perspective: 1000px;
        }
        div {
            width: 300px;
            height: 300px;
            background-color: pink;
            background-image: url("../day01/images/258f8d4142885c10.jpg.jpg");
            background-size: contain;
            /* transform: translate3d(100px,100px,100px); */
            margin: 100px auto;
            /* transform: rotateY(60deg); */
            /* transform: rotateZ(60deg); */
            /* transform: rotateX(60deg); */
            transform: rotate3d(1,1,1,60deg);
        }
3.空间旋转

目标:使用rotate实现元素空间旋转效果

l.语法

(1)transform: rotateZ(值); (以前后方向为轴)

(2)transform: rotateX(值); (以左右方向为轴)

(3)transform: rotateY(值);(以上下方向为轴)

(4)rotate3d(x, y, z, 角度度数) :用来设置自定义旋转轴的位置及旋转的角度

2.左手法则

判断旋转方向: 左手握住旋转轴, 拇指指向正值方向, 手指弯曲方向为旋转正值方向

立体呈现

目标: 使用transform-style: preserve-3d呈现立体图形

思考:使用perspective透视属性能否呈现立体图形?

答:不能,perspective只增加近大远小、近实远虚的视觉效果。 实现边旋转边位移(参考车轮)的代码如下( 旋转会影响当前元素所在的坐标系:强烈建议:先移 动再旋转):

        transform: translateZ(-100px) rotateY(180deg);
        /*transform: rotateY(180deg) translateZ(100px);*/
4.立体呈现 (3D模型)

目标: 使用transform-style: preserve-3d呈现立体图形

思考:使用perspective透视属性能否呈现立体图形?

答:不能,perspective只增加近大远小、近实远虚的视觉效果。

实现方法

1.添加 transform-style: preserve-3d; (父元素添加)

2.按需求设置子盒子的位置(位移或旋转)

作用 使子元素处于真正的3d空间

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>Title</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
​
      input {
        width: 50px;
      }
​
      .box {
        width: 200px;
        height: 200px;
        position: relative;
        margin: 100px auto;
        /* 给box开辟3D空间 */
        transform-style: preserve-3d;
 
        perspective-origin: 0px 0px;
​
        transform: rotate3d(1, 1, 1, 30deg);
      }
​
      .box > div {
        width: 200px;
        height: 200px;
        position: absolute;
        left: 0;
        top: 0;
        opacity: 0.9;
        font-size: 30px;
        
      }
​
      ::input-selection {
        background-color: #000;
        color: #fff;
      }
​
      .front {
        background-color: #ff1703;
      }
​
      .back {
        background-color: #ffc629;
      }
​
      .left {
        background-color: #53ff27;
      }
​
      .right {
        background-color: #18ffe4;
      }
​
      .top {
        background-color: #0c00ff;
      }
​
      .bottom {
        background-color: #ff21cb;
      }
​
      /*将第一个div前移*/
​
      .front {
        transform: translateZ(100px);
      }
​
      /*第二个div后移*/
​
      .back {
        transform: translateZ(-100px) rotateY(180deg);
        /*旋转会影响当前元素所在的坐标系:强烈建议:先移动再旋转*/
        /*transform: rotateY(180deg) translateZ(100px);*/
      }
​
      .left {
        transform: translateX(-100px) rotateY(-90deg);
      }
​
      .right {
        transform: translateX(100px) rotateY(90deg);
      }
​
      .top {
        transform: translateY(-100px) rotateX(90deg);
      }
​
      .bottom {
        transform: translateY(100px) rotateX(-90deg);
      }
​
      body {
        perspective: 1000px;
      }
    </style>
  </head>
​
  <body>
    <div class="box">
      <div class="front">前面</div>
      <div class="back">后面</div>
      <div class="left">左边</div>
      <div class="right">右边</div>
      <div class="top">上面</div>
      <div class="bottom">下面</div>
    </div>
  </body>
</html>
5.空间缩放

目标:使用scale实现空间缩放效果

语法

(1) transform: scaleX(倍数);

(2) transform: scaleY(倍数);

(3) transform: scaleZ(倍数);

(4) transform: scale3d(x, y, z);