前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >CSS笔记(26)

CSS笔记(26)

作者头像
y191024
发布2022-09-20 19:40:08
3450
发布2022-09-20 19:40:08
举报
文章被收录于专栏:睡不着所以学编程

3D转换

三维坐标系

  • x轴:水平向右
  • y轴:垂直向下
  • z轴:垂直屏幕 注意: 往外面是正值,往里面是负值(肥肠重要!).

主要知识点

  • 3D位移: translate3d(x,y,z)
  • 3D旋转: rotate(x,y,z)
  • 透视perspective
  • 3D呈现: transform-style

3D移动之translate3d

其中,xyz都是不能省略的,没有的话就写0.

透视perspective

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

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

透视写在被观察的父盒子上面

d:就是视距,即我们的眼睛到屏幕的距离.

z:就是z轴

代码语言:javascript
复制
   body {
            perspective:300px;
        }
        .bb {
            margin: 0 auto;
            width: 200px;
            height: 200px;
            background-color: pink;
            transform: translate3d(400px,100px,100px);
        }
    </style>
</head>
<body>
    <div class="bb"></div>
</body>

3D旋转之rotate3d

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

语法:

现在我们做一个让小猪佩奇3d旋转的小例子.

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            perspective: 500px;
        }
        img {
            display: block;
            margin: 100px auto;
            transition: all 2s;
        }
        img:hover {
            transform: rotateX(360deg);
        }
</style>
</head>
<body>
    <img src="../images/pig.jpg" alt="">
</body>
</html>

我们可以通过左手准则来判断元素朝哪个方向转动.

transform:rotate3d(x,y,z,deg):沿着自定义轴旋转deg为角度(了解即可)

xyz是代表旋转轴的矢量,是标示你是否希望沿着该轴旋转,最后一个标示旋转的角度.

假如说,我们设置旋转的矢量是(1,1,0,45deg),那么就是沿着下图的轴旋转.

看一个动图理解一下:

做到现在发现有一些透视效果火狐居然不能显示出来,所以现在在将vscode的liveserver的默认浏览器换成Chrome的,结果居然一直打不开,现在正在解决...

重装了一次Chrome以后就可以了...

3D呈现之transform-style

  • 控制子元素是否开启三维立体环境.
  • transform-style:flat子元素不开启3d立体空间,这是默认的.
  • transform-style:preserve-3d子元素开启立体空间.
  • 代码写给父级,但是影响的是子盒子.
  • 这个属性很重要,后面必用.

现在我们要做一个小案例:

我现在已经做到了这一步:用整个box装两个盒子,一个是粉色的,一个是黄色的,我们给黄色的盒子一个沿X轴转60度的旋转,给body500px的透视.出来的效果是这样的:

但是当我想要这个盒子转过去的时候,出现了这样的状况:

可以看到,黄色盒子的旋转的效果突然变回二维平面的.

变成了这样的效果

现在我们就给我们的父盒子box加上一个transform-style:preserve-3d,看看效果如何:

现在便有了立体的效果嘿嘿.

刚刚又做了一个案例,还是稍稍有点难的,主要是很难想:

主要的思路:

先放一个大的盒子.box,然后再在里面放两个小盒子,一个是正面.front,一个是背面.back,给两个盒子设置好大小和文字之类的属性,最后再让整个盒子旋转. 就可以得到上面的旋转图.

重点来了:

  1. 当我们给两个盒子设置了定位以后,出现在上面的是back盒子,因为back盒子在结构中处于下面,必然会把正面的盒子压住.
  2. 如何让正面反过来的时候出现背面的盒子且是正确显示的呢?按理来说,背后的盒子如果直接翻转过来,文字是反的.
  3. 最后翻转的时候盒子的背面显示不出来.

解决方法:

  1. 我们可以使用z-index,给.front来个1的z-index值.front盒子就可以显示在上面了.
  2. 我们可以首先让两个盒子处于"背对背拥抱"的位置,也就是说,先给背面的盒子沿着Y轴旋转180度.
  3. 因为3d效果的环境没有开启,所以是看不到效果的,我们只要添加transform-style:preserve-3d即可.

下面来展示一下代码:

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        .box {
            position: relative;
            width: 200px;
            height: 200px;
            margin: 100px auto;
            transition: all 2s;
            transform-style: preserve-3d;
        }

        .front,
        .back {
            position: absolute;
            width: 200px;
            height: 200px;
            border-radius: 50%;
            text-align: center;
            line-height: 200px;
            font-size: 30px;
            color: #fff;
        }
        
        .back {
            background-color: seagreen;
            /* 先让背面的盒子转108度到背面去 */
            transform: rotateY(180deg);
        }
        
        .front {
            background-color: salmon;
            z-index: 1;
        }
        
        .box:hover {
            transform: rotateY(180deg);
            /* z-index: 0; */
        }
</style>
</head>

<body>
    <div class="box">
        <div class="front">
            你好
        </div>
        <div class="back">
            再见
        </div>
    </div>
</body>

</html>

刚刚又做了一个案例,实在是太累了,我自己想了很久才做好,中间出了很多岔子,好在还是做出来的,但是还是有点点问题....

重点!!!如果移动(translate)的属性和其他属性同时出现,必须先写translate!!!

今天学得很累,就不做多解释了...

代码语言:javascript
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <style>
        body {
            /* perspective: 500px; */
            transform-style: preserve-3d;
        }
        .box {
            float: left;
            transform-style: preserve-3d;
            position: relative;
            width: 100px;
            height: 50px;
            margin: 100px 10px;
            transition: all .5s;
        }

        .front,
        .down {
            position: absolute;
            width: 100px;
            height: 50px;
            text-align: center;
            line-height: 50px;
            font-size: 20px;
            color: #fff;
        }
        .front {
            background-color: salmon;
            z-index: 1;
        }
        .down {
            top: 25px;
            background-color: sandybrown;
            transition: all 2s;
            /* 270deg或者-90deg都是可以的 */
            transform: translateZ(-25px) rotateX(270deg);
        }
        .box:hover{
            /* 如果有移动和其他的属性同时出现,必须把移动写在前面!!!!!!!! */
            transform: translateY(-25px) rotateX(90deg);
            
        }
</style>
</head>
<body>
    <div class="box">
        <div class="front">你好</div>
        <div class="down">再见</div>
    </div>
    <div class="box">
        <div class="front">你好</div>
        <div class="down">再见</div>
    </div>
    <div class="box">
        <div class="front">你好</div>
        <div class="down">再见</div>
    </div>
    <div class="box">
        <div class="front">你好</div>
        <div class="down">再见</div>
    </div>
    <div class="box">
        <div class="front">你好</div>
        <div class="down">再见</div>
    </div>

</body>
</html>
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-09-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 睡不着所以学编程 微信公众号,前往查看

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

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

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