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


        目录
        相关文章
        |
        前端开发 JavaScript UED
        过渡效果的艺术:CSS transition 让网页交互更平滑(上)
        过渡效果的艺术:CSS transition 让网页交互更平滑(上)
        |
        2月前
        |
        机器学习/深度学习 传感器 存储
        概念解析:机器视觉如何赋予机器“三维双眼”——3D重建技术全景指南
        本文系统解析机器视觉驱动的3D重建技术,涵盖被动视觉(单目SfM、双目立体、NeRF、3D高斯泼溅)与主动视觉(结构光、ToF)四大范式,详解原理、流程、优劣及典型应用,助力理解从2D图像到真实三维世界的智能跃迁。(239字)
        671 6
        |
        10月前
        抖音自动点赞收藏脚本插件,可批量点赞无限制,评论区指定ID点赞工具源码
        这是一套用于抖音营销的自动化工具源码,可实现批量点赞指定评论ID与作品点赞收藏功能,大幅提升营销效率。支持自定义话术、随机发送评论
        |
        JSON 小程序 前端开发
        终于搞懂了!微信小程序的渲染机制及组件使用
        【8月更文挑战第8天】微信小程序的渲染机制及组件使用
        1107 3
        终于搞懂了!微信小程序的渲染机制及组件使用
        |
        JavaScript
        Vue3加载中(Spin)
        该加载组件 `Spin.vue` 可高度自定义加载状态,包括是否显示加载 (`spinning`)、尺寸 (`size`)、描述文案 (`tip`)、加载指示符 (`indicator`) 及其颜色 (`color`) 和其他细节参数。支持多种加载样式如点、线、圆环等,并允许调整动画速度和初始旋转状态。组件基于 Vue 构建,易于集成到任何项目中,提供丰富的视觉反馈。
        322 5
        Vue3加载中(Spin)
        |
        前端开发 JavaScript 数据挖掘
        浅谈游戏地图中位置实时更新的技术方案
        浅谈游戏地图中位置实时更新的技术方案
        572 1
        |
        开发者 C# 存储
        WPF开发者必读:资源字典应用秘籍,轻松实现样式与模板共享,让你的WPF应用更上一层楼!
        【8月更文挑战第31天】在WPF开发中,资源字典是一种强大的工具,用于共享样式、模板、图像等资源,提高了应用的可维护性和可扩展性。本文介绍了资源字典的基础知识、创建方法及最佳实践,并通过示例展示了如何在项目中有效利用资源字典,实现资源的重用和动态绑定。
        528 0
        |
        C# 开发者 UED
        WPF开发者必备秘籍:深度解析文件对话框使用技巧,打开与保存文件原来如此简单!
        【8月更文挑战第31天】在WPF应用开发中,文件操作是常见需求。本文详细介绍了如何利用`Microsoft.Win32`命名空间下的`OpenFileDialog`和`SaveFileDialog`类来正确实现文件打开与保存功能。通过示例代码展示了如何设置文件过滤器、初始目录等属性,并使用对话框进行文件读写操作。正确使用文件对话框能显著提升用户体验,使应用更友好易用。
        680 0
        |
        前端开发
        css 拉伸 resize —— 实现可拉伸的div(含限制拉伸的尺寸)
        css 拉伸 resize —— 实现可拉伸的div(含限制拉伸的尺寸)
        924 1
        |
        传感器 Web App开发 机器学习/深度学习
        计算机视觉教程0-3:为何拍照会有死亡视角?详解相机矩阵与畸变
        计算机视觉教程0-3:为何拍照会有死亡视角?详解相机矩阵与畸变
        2064 0
        计算机视觉教程0-3:为何拍照会有死亡视角?详解相机矩阵与畸变

        热门文章

        最新文章