【Transform3D】转换详解(看完就会)

简介: 【Transform3D】转换详解(看完就会)

 前言

3D可以帮助我们实现更好的页面动画效果,我们生活的环境是 3D 的,照片就是 3D 物体在 2D 平面呈现的例子。

有什么特点

    • 近大远小
    • 物体后面遮挡不可见

    当我们在网页上构建 3D 效果的时候参考这些特点就能产出 3D 效果。

    教学

           坐标轴

                   

                   三维坐标系其实就是指立体空间,立体空间是由3个轴共同组成的。

                   在x,y轴的基础上,又增加了一条从外向内的Z轴,

                   image.gif编辑

           移动

    x 轴 水平向右(注意:x 右边是正值,左边是负值)
    y 轴 垂直向下(注意:y 下面是正值,上面是负值)
    z 轴 垂直屏幕(注意:往外面是正值,往里面是负值)

        注意重点:坐标轴原点为图形的左上角

    <style>
    #div1
    {
      position: relative;
      height: 200px;
      width: 200px;
      margin: 100px;
      padding:10px;
      border: 1px solid black;
    }
    #div2
    {
      padding:50px;
      position: absolute;
      border: 1px solid black;
      background-color: red;
      transform: translateX(100px);
        z-index: 1;
    }
    #div3
    {
      padding:50px;
      position: absolute;
      border: 1px solid black;
      background-color: red;
    }
    </style>
    </head>
    <body>
    <div id="div1">
      <div id="div2">HELLO</div>
      <div id="div3">HELLO</div>
    </div>
    </body>

    网络异常,图片无法展示
    |

    image.gif编辑

    左边的是原位置的,右边的是移动100px的。

    3D 移动在 2D 移动的基础上多加了一个可以移动的方向,就是 z 轴方向。

      • transform:translateX(100px):仅仅是在 X 轴上移动  (x轴右边)
      • transform:translateY(100px):仅仅是在 Y 轴上移动    (Y轴下边)
      • transform:translateZ(100px):仅仅是在 Z 轴上移动(注意:translateZ 一般用 px 单位,Z轴向外。)
      • transform:translate3d(x, y, z):其中 x、y、z 分别指要移动的轴的方向的距离

      因为 z 轴是垂直屏幕,由里指向外面,所以默认是看不到元素在 z 轴的方向上移动(要借助透视)。

             旋转

             image.gif编辑image.gif编辑

      <style>
      #div1
      {
        position: relative;
        height: 200px;
        width: 200px;
        margin: 100px;
        padding:10px;
        border: 1px solid black;
      }
      #div2
      {
        padding:50px;
        position: absolute;
        border: 1px solid black;
        background-color: green;
        transform: rotateX(100deg);
          z-index: 1;
      }
      #div3
      {
        padding:50px;
        position: absolute;
        border: 1px solid black;
        background-color: red;
      }
      </style>
      </head>
      <body>
      <div id="div1">
        <div id="div2">HELLO</div>
        <div id="div3">HELLO</div>
      </div>
      </body>

      image.gif

      image.gif编辑  

      以x轴旋转100°,就是向里旋转100°,看着变窄了是因为没有使用透视,绕Z轴旋转就跟2d旋转一样。

      transform:rotate3d(0,1,0,45deg)  绕y轴旋转45°,前三位分别是 xyz  ,写1就是选择某个坐标轴,  第四位写度数。

      矢量旋转:

      transform:rotate3d(1,1,0,45deg) 第四域的对角线旋转45°。

      注意重点:坐标轴原点为图形的中心点,实际上是由左上角的原点,通过transform-origin:50% 50% ;移动到了图形的中心点,transform-origin的默认值就是 50% 505 0;我们可以通过transform-origin属性来改变原点的位置,  注意中的注意就是  这个属性只是改变旋转的中心点,translate移动的的中心点不变,依然是左上角的。

             透视

      在 2D 平面产生近大远小视觉立体,但是效果只是二维的。

        • 如果想要在网页产生 3D 效果需要透视(理解成 3D 物体投影在 2D 平面内)
        • 模拟人类的视觉位置,可认为安排一只眼睛去看
        • 透视我们也称为视距:视距就是人的眼睛到屏幕的距离
        • 距离视觉点越近的,在电脑平面成像越大,越远成像越小
        • 透视的单位是像素

        我们给之前的3dX旋转加上透视效果,

                     

        <style>
        #div1
        {
          position: relative;
          height: 200px;
          width: 200px;
          margin: 100px;
          padding:10px;
          border: 1px solid black;
          perspective: 500px;
        }
        #div2
        {
          padding:50px;
          position: absolute;
          border: 1px solid black;
          background-color: green;
          transform: rotateX(100deg);
            z-index: 1;
        }
        #div3
        {
          padding:50px;
          position: absolute;
          border: 1px solid black;
          background-color: red;
        }
        </style>
        </head>
        <body>
        <div id="div1">
          <div id="div2">HELLO</div>
          <div id="div3">HELLO</div>
        </div>
        </body>

        image.gif

        image.gif编辑

        这样在平面上通过透视产生一种长短大小不一的3d效果。

        perspective就相当于人眼到图像的距离,就相当于你看某个东西,你距离写的越大,你就站的越远,物体就越小,站的越近,距离写的越小,物体越大。

        页面上显示的就相当于是你看到的物体的投影。

        perspective尽可能写在直接父级上,写在大于父亲级的祖元素上有可能会失灵,但如果搭配transform-style: preserve-3d,两个一起用,又会起作用。

        perspective只是实现了2d里的3d视觉显示,并不是一个3d空间,就比如前面的div向里倾斜,如果是3d的空间的话 那么会穿透后面的红色盒子,如何达到真正的3d效果呢   就是接下来要说的的属性。

               打开3D空间

               transform-style: preserve-3d;  

               看例子

        <style>
                #div1 {
                    position: relative;
                    height: 200px;
                    width: 200px;
                    margin: 100px;
                    padding: 10px;
                    border: 1px solid black;
                    perspective: 300px;
                    transform-style: preserve-3d;
                    transition: all 3s;
                }
                #div1:hover {
                    transform: rotateY(-120deg);
                }
                #div2 {
                    padding: 50px;
                    position: absolute;
                    border: 1px solid black;
                    background-color: green;
                    transform: rotateX(60deg);
                    z-index: 1;
                }
                #div3 {
                    padding: 50px;
                    position: absolute;
                    border: 1px solid black;
                    background-color: red;
                }
            </style>
        </head>
        <body>
            <div id="div1">
                <div id="div2">HELLO</div>
                <div id="div3">HELLO</div>
            </div>
        </body>

        image.gif

               

        网络异常,图片无法展示
        |
        编辑

        下面是给box盒子加上透视的效果

        image.gif编辑

             

        总结

        1.移动的中心点跟旋转中心点是分开的,transform-origin只是修改旋转的原点,移动位置不变依然是左上角。

        2.3d旋转是坐标轴是跟随移动的,所以建议当完成某种效果时,先移动后旋转,先旋转改变坐标轴,移动的方向就会有差别。

        3.想要完成一个3D效果 需要用到perspective: 500px;和 transform-style: preserve-3d;两个属性才能完全达到3D效果,注意perspective属性放在更高的父级上的效果区别,建议用在直接父级上。

        案例

               3D转换

        <style>
                * {
                    margin: 0;
                    padding: 0;
                }
                ul {
                    margin: 100px;
                }
                ul li {
                    width: 120px;
                    height: 35px;
                    list-style: none;
                    float: left;
                    margin-left: 10px;
                    text-align: center;
                    color: white;
                }
                .box {
                    position: relative;
                    width: 100%;
                    height: 100%;
                    perspective: 500px;
                    transform-style: preserve-3d;
                    transition: all 1s;
                    line-height: 35px;
                }
                .box:hover {
                    transform: rotateX(90deg);
                }
                .front,
                .bottom {
                    position: absolute;
                    left: 0;
                    top: 0;
                    right: 0;
                    bottom: 0;
                }
                .front {
                    background-color: pink;
                    transform: translateZ(17.5px);
                    z-index: 1;
                }
                .bottom {
                    background-color: purple;
                    transform: translateY(17.5px) rotateX(-90deg);
                }
            </style>
        </head>
        <body>
            <ul>
                <li>
                    <div class="box">
                        <div class="front">黑马程序员</div>
                        <div class="bottom">pink老师</div>
                    </div>
                </li>
                <li>
                    <div class="box">
                        <div class="front">黑马程序员</div>
                        <div class="bottom">pink老师</div>
                    </div>
                </li>
                <li>
                    <div class="box">
                        <div class="front">黑马程序员</div>
                        <div class="bottom">pink老师</div>
                    </div>
                </li>
                <li>
                    <div class="box">
                        <div class="front">黑马程序员</div>
                        <div class="bottom">pink老师</div>
                    </div>
                </li>
            </ul>
        </body>

        image.gif

        image.gif编辑

               3D翻转

        <style>
                .box {
                    width: 300px;
                    height: 300px;
                    margin: 100px auto;
                    position: relative;
                    transition: all 3s;
                    transform-style: preserve-3d;
                }
                .box:hover {
                    transform: rotateY(180deg);
                }
                .front {
                    backface-visibility: hidden;
                }
                .front,
                .back {
                    position: absolute;
                    left: 0;
                    right: 0;
                    height: 100%;
                    border-radius: 50%;
                    color: #fff;
                    text-align: center;
                    font-size: 30px;
                    line-height: 300px;
                }
                .front {
                    background-color: pink;
                    z-index: 1;
                }
                .back {
                    background-color: purple;
                    transform: rotate3d(0, 1, 0, 180deg);
                }
            </style>
        </head>
        <body>
            <div class="box">
                <div class="front">黑马程序员</div>
                <div class="back">pink老师</div>
            </div>
        </body>

        image.gif

        image.gif编辑


        目录
        相关文章
        |
        9月前
        swr_convert和sws_scale转换时会拷贝哪些值
        swr_convert和sws_scale转换时会拷贝哪些值
        40 0
        |
        7月前
        |
        算法 计算机视觉 Python
        Transform
        离散傅里叶变换(Discrete Fourier Transform,简称 DFT)是一种将离散时间域信号转换为离散频域信号的数学变换方法。它可以将一个有限长度的离散信号序列转换为一系列不同频率的正弦和余弦波,从而使我们能够更容易地分析和处理信号。
        86 0
        |
        11月前
        |
        前端开发
        今天来讲讲 scale、translate 和 rotate 这三个属性,你不会以为我是要讲的是 transform 吧?
        总所周知,transform 是 CSS3 中最强大的属性之一,它有这么三个函数属性值:scale、translate 和 rotate,它们分别是缩放、位移和旋转,但是你有没有想过有这么一天它们三个
        140 0
        今天来讲讲 scale、translate 和 rotate 这三个属性,你不会以为我是要讲的是 transform 吧?
        fit、transform、fit_transform的区别和联系
        fit、transform、fit_transform的区别和联系
        CMKY与RGB的转换
        CMKY与RGB的转换
        81 0
        |
        分布式计算 大数据 API
        有类型转换_transform | 学习笔记
        快速学习有类型转换_transform
        57 0
        有类型转换_transform | 学习笔记
        |
        前端开发 JavaScript Java
        通过canvas转换颜色为RGBA格式及性能问题
        通过canvas转换颜色为RGBA格式及性能问题
        通过canvas转换颜色为RGBA格式及性能问题
        |
        SQL 数据处理 Python
        transform 数据转换的 4 个常用技巧!
        transform 数据转换的 4 个常用技巧!
        transform 数据转换的 4 个常用技巧!