前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CSS3d转换

CSS3d转换

作者头像
切图仔
发布2022-09-08 16:21:36
4210
发布2022-09-08 16:21:36
举报
文章被收录于专栏:生如夏花绚烂生如夏花绚烂

3D特点 近大远小 物体后面遮挡不可见

三维坐标系 x轴:水平向右 右边是正值,左边是负值 y轴:垂直向下 下面是正值,上面是负值 z轴:垂直屏幕 往外面是正值,往里面是负值 如下图: 不过在我们css中y轴向上是为负的,y轴向下为正,与下图相反

css3中的3D转换

  • 3D位移 translate3d(xyz)
  • 3D旋转 rotate3d(xyz)
  • 透视:perspective
  • 3d呈现transform-style

** 3d位移**

代码语言:javascript
复制
transform:translateZ(100px)沿着z轴移动(px)
transform:translate3d(x,y,z)分别的轴方向距离

如下例

代码语言:javascript
复制
<!DOCTYPE html>
<html>
   <head>
       <meta charset="utf-8" />
       <meta name="viewport" content="width=device-width, initial-scale=1">
       <title></title>
       <style>
           .map{
               width: 100px;
               height: 100px;
               background-color: red;
               margin:100px auto;
               transform: translate3d(100px,100px,100px); 
               /* x轴移动右边100px */
               /* y轴向下移动100px */
               /* z轴向外面移动100px */
           }
       </style>
   </head>
   <body>
     <div class="map"></div>
   </body>
</html>

可以看到盒子并没有什么变化,不是用了3d吗? 透视 这里我们得借助透视(perspective),通过透视可以使我们的网页展现3d效果。

  • 透视模拟人视觉的位置
  • 透视也称为视距指的是人的眼睛到屏幕的距离
  • 距离视觉点越近的在电脑平面成像越大,越远成像越小
  • 透视的单位是像素

借上图理解透视 一般情况“眼睛”看到的物体比“眼睛二”小,这是因为视距的带来的近大远小的问题,当人的眼睛离屏幕越近时他看到的物体越大,相反他看到的物体越小,这个人眼睛到屏幕的距离就称之为视距。 而z就是css中的translateZ也就是z轴物体离屏幕的距离,这个值越大看到的物体越大,值小看到的物体越小

了解上面的透视和translateZ之后我们就可以给我们的案例加上透视效果了 不过需要注意的是透视是写在被观察元素的父盒子上面的,说白了就是当子元素要实现3d效果那么应该在父元素上设置相应的透视

代码语言:javascript
复制
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title></title>
        <style>
            body{
                perspective: 200px;
            }
            .map{
                width: 100px;
                height: 100px;
                background-color: red;
                margin:100px auto;
                transform: translate3d(100px,100px,100px); 
                /* x轴移动右边100px */
                /* y轴向下移动100px */
                /* z轴向外面移动100px */
            }
        </style>
    </head>
    <body>
      <div class="map">
    
      </div>
    </body>
</html>

可以看到加了透视后,我们的元素比之前大了

上面提到translateZ和perspective都可以实现近大远小的效果,我们会想他两不是一样的吗? 其实不然,perspective指的是我们观察物体的距离 如果我们body有三个元素,并且在视距相同的情况下,此时元素大小是相同的,如果我们设置每个元素不同的translateZ,这样我们看到的每个元素就会不同

代码语言:javascript
复制
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title></title>
        <style>
            body{
                perspective: 200px;
            }
            .map,.map2{
                width: 100px;
                height: 100px;
                background-color: red;
                margin:100px auto;
                transform: translate3d(100px,100px,100px); 
                /* x轴移动右边100px */
                /* y轴向下移动100px */
                /* z轴向外面移动100px */
            }
            .map2{
                transform: translate3d(100px,100px,50px); 
                background-color: blue;
            }
        </style>
    </head>
    <body>
      <div class="map">
    
      </div>
      <div class="map2">
          2
      </div>

      
    </body>
</html>

这里看不出来什么惊艳的效果,但基于这个特性我们可以实现很多有趣的东西如3d相册就是利用了这一特性

3d旋转 指可以让元素在三维平面内沿着x轴,y轴,z轴或者自定义轴进行旋转

  • transform:rotateX()
  • rotateY()
  • rotateZ
  • rotaet3d(x,y,z,deg)

1.rotateX()使元素沿x轴旋转

代码语言:javascript
复制
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title></title>
        <style>
            body{
                perspective: 200px;
            }
            img{
                display: block;
                margin: 100px auto;
                transform: rotateX(45deg);
            }
        </style>
    </head>
    <body>
    <img src='./media.jpg'>
    </body>
</html>

可以看到图片沿着x轴正方向旋转了45度,只所以有3d效果是因为我们加了透视实现了近大远小的效果

rotateY示例

代码语言:javascript
复制
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title></title>
        <style>
            body{
                perspective: 200px;
            }
            img{
                display: block;
                margin: 100px auto;
                transform: rotateY(45deg);
            }
        </style>
    </head>
    <body>
    <img src='./media.jpg'>
    </body>
</html>

rotateZ

这里rotateZ其实与我们的2d旋转是一样的,因为z轴是眼睛到屏幕的垂直距离,z轴就是居于这个距离旋转,所以看到的是平面旋转

代码语言:javascript
复制
    img{
                display: block;
                margin: 100px auto;
                transform: rotateY(45deg);
            }

transform-style 控制子元素是否开启三维立体环境

  • transform-style:flat子元素不开启3d立体空间(默认)
  • transform-style:preserve-3d:子元素开启立体空间
  • 这个属性需在父盒子指定

它有什么用? 如下实现这种效果

代码语言:javascript
复制
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title></title>
        <style>
            body{
                perspective: 200px;
            }
            .box{
                width: 200px;
                height: 200px;
                margin:100px auto;
                position: relative;
                transform-style: preserve-3d;
        }
            .box:hover{
                transform: rotateY(45deg);
            }
            .son1,.son2{
                position: absolute;
                top:0;
                width: 100%;
                height: 100%;
                background-color: red;
            }
            .son2{
                background-color: aqua;
                transform: rotateX(60deg);
            }

            
        </style>
    </head>
    <body>
        <div class="box">
            <div class="son1"></div>
            <div class="son2"></div>
        </div>
      
    </body>
</html>

如果这里没有使用transform-style: preserve-3d那看到的效果是这样的

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-08-03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
图像处理
图像处理基于腾讯云深度学习等人工智能技术,提供综合性的图像优化处理服务,包括图像质量评估、图像清晰度增强、图像智能裁剪等。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档