【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编辑


        目录
        相关文章
        |
        28天前
        transform
        【10月更文挑战第6天】transform。
        47 4
        |
        3月前
        认识transform
        【8月更文挑战第24天】认识transform。
        72 1
        |
        6月前
        |
        算法 数据可视化 计算机视觉
        Transform
        Transform“【5月更文挑战第16天】”
        53 1
        swr_convert和sws_scale转换时会拷贝哪些值
        swr_convert和sws_scale转换时会拷贝哪些值
        130 0
        |
        前端开发
        今天来讲讲 scale、translate 和 rotate 这三个属性,你不会以为我是要讲的是 transform 吧?
        总所周知,transform 是 CSS3 中最强大的属性之一,它有这么三个函数属性值:scale、translate 和 rotate,它们分别是缩放、位移和旋转,但是你有没有想过有这么一天它们三个
        266 0
        今天来讲讲 scale、translate 和 rotate 这三个属性,你不会以为我是要讲的是 transform 吧?
        |
        分布式计算 大数据 API
        有类型转换_transform | 学习笔记
        快速学习有类型转换_transform
        有类型转换_transform | 学习笔记
        CMKY与RGB的转换
        CMKY与RGB的转换
        106 0
        RGB转换为NV12的代码
        RGB转换为NV12的代码
        249 0
        |
        前端开发 JavaScript Java
        通过canvas转换颜色为RGBA格式及性能问题
        通过canvas转换颜色为RGBA格式及性能问题
        通过canvas转换颜色为RGBA格式及性能问题