开发者社区> 解圃> 正文

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

简介: 【Transform3D】转换详解(看完就会)
+关注继续查看
福利推荐:阿里云、腾讯云、华为云等大品牌云产品全线2折优惠活动来袭,4核8G云服务器899元/3年,新老用户共享优惠,点击这里立即抢购>>>

?前言

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

有什么特点

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

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

    教学

    ? ? ? ? 坐标轴

    ????????????????

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

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

    ??????????????? imageimage.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>

    imageimage.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 轴的方向上移动(要借助透视)。

      ? ? ? ? 旋转

      ??????? imageimage.gif编辑imageimage.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

      imageimage.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

        imageimage.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

        ??????? image编辑

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

        imageimage.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

        imageimage.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

        imageimage.gif编辑


        版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

        相关文章
        transform 数据转换的 4 个常用技巧!
        transform 数据转换的 4 个常用技巧!
        194 0
        BWT (Burrows–Wheeler_transform)数据转换算法
        1.什么是BWT ?  压缩技术主要的工作方式就是找到重复的模式,进行紧密的编码。   BWT(Burrows–Wheeler_transform)将原来的文本转换为一个相似的文本,转换后使得相同的字符位置连续或者相邻,之后可以使用其他技术如:Move-to-front transform?和?游程编码?进行文本压缩。
        1142 0
        A+B for Matrices 及 C++ transform的用法
        题目大意:给定两个矩阵,矩阵的最大大小是M*N(小于等于10),矩阵元素的值的绝对值小于等于100,求矩阵相加后全0的行以及列数。 1 #include 2 using namespace std; 3 #define N 10 4 5 int main() 6 {...
        709 0
        有类型转换_transform | 学习笔记
        快速学习有类型转换_transform
        17 0
        MTF(Move-to-front transform)数据转换
        1.什么是MTF   MTF(move-to-front)是一种数据编码方式,用于提高数据压缩技术效果。   在数据压缩算法中,MTF可以作为一个额外的步骤。也就是说 ,可以先进行MTF编码,在进行数据压缩。
        1139 0
        transform旋转变换效果
        div{  transform:rotate(7deg);  -ms-transform:rotate(7deg); /* IE 9 */  -moz-transform:rotate(7deg); /* Firefox */  -webkit-transform:rotate(7deg); /* Safari 和 Chrome */  -o-transform:rotate(7deg); /* Opera */} 语法: transform: none|transform-functions; none 定义不进行转换。
        763 0
        OpenCV——line、circle、rectangle、ellipse、polylines函数的使用和绘制文本putText函数以及绘制中文的方法。
        学习OpenCV的过程中,画图是不可避免的,本篇文章旨在介绍OpenCV中与画图相关的基础函数。
        12 0
        CMKY与RGB的转换
        CMKY与RGB的转换
        24 0
        +关注
        文章
        问答
        文章排行榜
        最热
        最新
        相关电子书
        更多
        低代码开发师(初级)实战教程
        立即下载
        阿里巴巴DevOps 最佳实践手册
        立即下载
        冬季实战营第三期:MySQL数据库进阶实战
        立即下载


        http://www.vxiaotou.com