CSS -- CSS3中3D转换相关属性讲解(translate3d,rotate3d,perspective,transform-style)

news2024/11/17 14:18:22

文章目录

  • 3D转换
    • 1 三维坐标系
    • 2 3D移动 translate3d
    • 3 透视 perspective
    • 4 3D 旋转 rotate3d
    • 5 3D旋转 rotate3d
    • 6 3D呈现 transform-style
    • 7 3D案例

3D转换

我们生活的环境是3D的,照片就是3D物体在2D平面呈现的例子。

3D特点:

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

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

1 三维坐标系

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

  • x轴:水平向右 注意:X右边是正值,左边是负值
  • y轴:垂直向下 注意:y下面是正值,上面是负值
  • Z轴:垂直屏幕 注意:往外面是正值,往里面是负值

image-20221213185541567

3D转换我们主要学习工作中最常用的3D位移和3D旋转

2 3D移动 translate3d

3D移动在2D移动的基础上多加了一个可以移动的方向,就是Z轴方向。

  • translform:translateX(100px): 仅仅是在x轴上移动
  • translform:translateY(1OOpx): 仅仅是在Y轴上移动
  • translform:translateZ(100px): 仅仅是在Z轴上移动(注意:translateZ - 一般用px单位),向外移动100px
  • transform:translate3d(x,y,z): 其中x、y、z分别指要移动的轴的方向的距离,三个参数不能省略,没有就写0

translateZ必须借助perspective才能看到效果

3 透视 perspective

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

  • 如果想要在网页产生3D效果需要透视(理解成3D物体投影在2D平面内)
  • 模拟人类的视觉位置,可认为安排一只眼睛去看
  • 透视我们也称为视距视距就是人的眼睛到屏幕的距离,下面图示中的d
  • 距离视觉点越近的在电脑平面成像越大,越远成像越小
  • 透视的单位是像素
  • 透视写在被观察元素的父盒子上面的,translateZ是写着需要改动的元素身上的
    • d:就是视距,视 距就是一个距离人的眼睛到屏幕的距离。
    • Z:就是Z轴,物体距离屏幕的距离,轴越大(正值)我们看到的物体就越大。通过translateZ设置

最终呈现给我们的都是物体呈现在屏幕(Drawing Surface)上的样子,也就是浅蓝色的地方

不明白的话看视频:透视perspective

image-20221213190228953

4 3D 旋转 rotate3d

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

语法

  • transform:rotateX(45deg): 沿着x轴正方向旋转45度
  • transform:rotateY(45deg): 沿着y轴正方向旋转45deg
  • transform:rotateZ(45deg): 沿着Z轴正方向旋转45deg
  • transform:rotate3d(x,y,z,deg): 沿着自定义轴旋转deg为角度(了解即可)

transform: rotateX(45deg)效果

image-20221213191921465

transform: rotateX(-45deg)效果

image-20221213191952673

transform: rotateY(45deg)效果

image-20221213192314310

transform: rotateZ()的效果和2D的rotate效果一样

旋转方向的判断可以使用左手准则

  • 左手的手拇指指向x轴的正方向

  • 其余手指的弯曲方向就是该元素沿着x轴旋转的方向

    image-20221213191807952

    或者是可以想象人在x轴正无穷的位置看原点,将图像沿顺时针旋转的效果就是传入值为正数的效果

5 3D旋转 rotate3d

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

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

其实就是将三维坐标系内的该点和原点(0,0,0)的直线作为旋转轴(尽量都设置为正值,设置为负值的话旋转方向会和上面讲的相反)

  • rotate3d(1, 0, 0, 45deg):绕x轴旋转,同rotateX(45deg)
  • rotate3d(0, 1, 0, 45deg):绕y轴旋转,同rotateY(45deg)

6 3D呈现 transform-style

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

7 3D案例

案例一

实现下图的效果,必须要开启preserve-3d,如果不开的话看到的图形是有问题的

image-20221220135424930

<!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 {
                perspective: 500px;

                position: relative;
                margin: 100px auto;
                width: 200px;
                height: 300px;
                transition: all 1s;
                transform-style: preserve-3d;
            }

            .box:hover {
                transform: rotateY(60deg);
            }

            .box div {
                position: absolute;
                top: 0px;
                left: 0px;
                width: 100%;
                height: 100%;

                background-color: orange;
            }

            .box div:last-child {
                background-color: purple;
                transform: rotateX(60deg);
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div></div>
            <div></div>
        </div>
    </body>
</html>

案例二:

两面翻转的盒子,鼠标悬浮盒子自动翻转效果

image-20221220141040200

<!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: 300px; */
            }
            .box {
                position: relative;
                margin: 100px auto;
                width: 200px;
                height: 200px;
                /* perspective: 300px; */
                transition: all 0.7s;
                transform-style: preserve-3d;
            }

            .box:hover {
                transform: rotateY(180deg);
            }

            .box div {
                position: absolute;
                top: 0px;
                left: 0px;
                width: 100%;
                height: 100%;
                border-radius: 50%;
                font-size: 30px;
                color: #fff;
                text-align: center;
                line-height: 200px;
            }

            .box .front {
                background-color: orange;
                transform: translateZ(1px);
            }

            .box .back {
                background-color: rgb(96, 131, 206);
                transform: rotateY(180deg);
            }
        </style>
    </head>
    <body>
        <div class="box">
            <div class="front">前面</div>
            <div class="back">后面</div>
        </div>
    </body>
</html>

案例三:

旋转立方体

image-20221220143940080

<!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>
            ul {
                margin: 100px auto;
                list-style: none;
            }
            ul li {
                float: left;
                perspective: 300px;
                margin: 10px;
            }

            .box {
                position: relative;
                width: 100px;
                height: 40px;
                transition: all 0.4s linear;
                transform-style: preserve-3d;
            }

            .box:hover {
                transform: rotateX(90deg);
            }

            .front,
            .bottom {
                position: absolute;
                top: 0;
                left: 0;
                width: 100%;
                height: 100%;
                line-height: 40px;
                text-align: center;
                font-size: 20px;
                color: #fff;
            }

            .front {
                background-color: orange;
                transform: translateZ(20px);
            }

            .bottom {
                background-color: purple;
                transform: translateY(20px) rotateX(-90deg);
            }
        </style>
    </head>
    <body>
        <ul>
            <li>
                <div class="box">
                    <div class="front">前面</div>
                    <div class="bottom">下面</div>
                </div>
            </li>
            <li>
                <div class="box">
                    <div class="front">前面</div>
                    <div class="bottom">下面</div>
                </div>
            </li>
            <li>
                <div class="box">
                    <div class="front">前面</div>
                    <div class="bottom">下面</div>
                </div>
            </li>
            <li>
                <div class="box">
                    <div class="front">前面</div>
                    <div class="bottom">下面</div>
                </div>
            </li>
        </ul>
    </body>
</html>

案例四

旋转木马图片相册

image-20221220150017910

<!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: 1500px;
            }
            @keyframes rotate {
                0% {
                    transform: rotateY(0deg);
                }
                100% {
                    transform: rotateY(360deg);
                }
            }
            section {
                position: relative;
                width: 300px;
                height: 200px;
                margin: 100px auto;
                transform-style: preserve-3d;
                animation: rotate 10s infinite linear;
            }

            div {
                position: absolute;
                top: 0;
                left: 0;
                width: 100%;
                height: 100%;
                background: url(images/img.jpg) no-repeat center center;
            }
            section div:nth-child(1) {
                transform: translateZ(300px);
            }
            section div:nth-child(2) {
                transform: rotateY(60deg) translateZ(300px);
            }
            section div:nth-child(3) {
                transform: rotateY(120deg) translateZ(300px);
            }
            section div:nth-child(4) {
                transform: rotateY(180deg) translateZ(300px);
            }
            section div:nth-child(5) {
                transform: rotateY(240deg) translateZ(300px);
            }
            section div:nth-child(6) {
                transform: rotateY(300deg) translateZ(300px);
            }
        </style>
    </head>
    <body>
        <section>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
        </section>
    </body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/107583.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[论文阅读] PointSeg: Real-Time Semantic Segmentation Based on 3D LiDAR Point Cloud

文章目录1. 主要思想2. 具体方法2.1 数据投影2.2 网络结构3. 实验支撑4. 总结启示5. 相关文献paper 原论文的链接 code: 源代码链接 67.4 (car) 19.2(ped) 32.7(cyclist)|90 fps/GPU 1. 主要思想 通过什么方式&#xff0c;解决了什么问题 在SqueezeSeg的基础上&#xff0c;利用…

小学生C++编程基础 课程8(A)

912.买水果 (课程8&#xff09; 登录 913.1或2 (课程8&#xff09; 登录 914.and和or &#xff08;课程8&#xff09; 难度&#xff1a;1 登录 915.在区间里 ( 课程8 ) 难度&#xff1a;1 登录 916.区间交集 ( 课程8 ) 难度&#xff1a;1 登录 917.区间并集 ( 课程8 ) 难度…

zabbix“专家坐诊”第178期问答汇总

大家好&#xff0c;我是乐乐。早在三年前&#xff0c;我们就在社区举办了zabbix公益问答活动&#xff0c;并且定在每周三邀请资深的zabbix技术工程师&#xff0c;为社群的小伙伴进行免费的答疑。到现在已经178期了。后续我将会把每期的答疑汇总分享在百家&#xff0c;供广大的z…

Qt——基本介绍、详解对象树

目录 一.基本介绍 二.对象树 一.基本介绍 创建qt项目是&#xff0c;如果选择空窗口QWidget&#xff0c;那么mian函数中会有如下代码&#xff1a; #include "myWindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, ar…

【微服务】Nacos为什么丢弃短连接(http)而选择拥抱长连接(gRPC)

目录 一、现状背景 二、场景分析 1、配置 2、服务 三、长连接核心诉求 1、功能性诉求 1.1、客户端 1.2、服务端 2、性能 3、负载均衡 4、连接生命周期 4.1、心跳保活机制 4.2、需要什么 四、长连接选型对比 五、基于长链接的⼀致性模型 1.、配置⼀致性模型 1.…

Unity导出并制作window安装程序exe

前言 如果我们是做pc端游或者基于pc的一些应用的&#xff0c;那么我们肯定对打包exe应用程序不陌生&#xff0c;我们经常会用到一些软件&#xff0c;比如&#xff1a;inno setup&#xff0c;NSIS等 而使用unity做游戏开发的的人来说&#xff0c;一般导出程序都是面向手机的apk…

比亚迪艰难的国际化之路

来源:猛兽财经 作者&#xff1a;猛兽财经 比亚迪是如何在中国市场取得成功的&#xff1f; 在深入分析比亚迪&#xff08;01211&#xff09;的国际化之前&#xff0c;我们有必要先了解一下比亚迪是如何在国内市场取得成功的。为了说明这一点&#xff0c;猛兽财经将在接下来进行…

【评测】扩散流完整性测试原理

早在1997 年出台的21 CFR Part 11中&#xff0c;就对与药物产品审批放行相关的电子记录有规定&#xff0c;应采取与纸质记录相同的控制要求1&#xff0c;包括生成或维护电子记录须采用恰当的访问控制措施&#xff0c;记录变更必须体现在记录审计追踪中等。 2003年&#xff0c;…

深度理解go中的Map

这里写自定义目录标题前言map的内存模型增量扩容查找过程分析插入过程分析前言 本篇将从底层讲解map的赋值、删除、查询、扩容的具体执行过程。结合源码&#xff0c;让你彻底明白map的原理。 map的内存模型 在源码中&#xff0c;表示map的结构体是hmap&#xff0c;其定义如下…

红队隧道应用篇之Burpsuite设置上游代理访问内网(五)

为何要设置上层代理 Burp Suite设置上游代理的主要原因是为了拦截和修改来自浏览器的请求。当您在使用Burp Suite进行Web应用程序安全测试时&#xff0c;您可能希望模拟攻击者发送恶意请求&#xff0c;以测试应用程序是否能够防御这些攻击。使用上游代理可以帮助您在浏览器和目…

Android OpenGL ES 学习(十) – GLSurfaceView 源码解析GL线程以及自定义 EGL

OpenGL 学习教程 Android OpenGL ES 学习(一) – 基本概念 Android OpenGL ES 学习(二) – 图形渲染管线和GLSL Android OpenGL ES 学习(三) – 绘制平面图形 Android OpenGL ES 学习(四) – 正交投影 Android OpenGL ES 学习(五) – 渐变色 Android OpenGL ES 学习(六) – 使用…

python自定义包实例

了解python中的异常捕获与传递请点击“python中的异常捕获与传递” 了解python中的模块与包详解请点击“python中的模块与包详解” 目录 一.实例&#xff1a;自定义包 二.详解 1.新建my_utils包 2.新建str_util.py和file_util.py两个python file 3.str_util.py中的代码 演…

移动设备软件开发-AlertDialog6种使用方法

AlertDialog 1.AlertDialog的6种创建模式 1.1setMessage 1&#xff09;Java代码 //1.创建构造器AlertDialog.Builder buildernew AlertDialog.Builder(this);//2.设置参数builder.setTitle("弹窗提示").setIcon(R.mipmap.boy).setMessage("选择你的性别&#xf…

什么是WMS系统?WMS系统有什么功能

科技进步促使的数字化转型正在为大多数行业铺平道路&#xff0c;并重新定义它们在各个方面的功能&#xff0c;物流行业也不例外&#xff0c;因为它见证了日常运营的重大转变。改变物流行业的关键之一就是WMS系统的引入。仓储一直是运输和物流部门的核心支柱&#xff0c;随着新工…

基于Vue+Express+Mysql开发的手机端电影购票系统(附源码)

基于VueExpressMysql开发的手机端电影购票系统 基于手机的电影购票系统-VueNode 一个VueExpressMysql的电影售票项目 项目完整源码下载 https://download.csdn.net/download/DeepLearning_/87327200 前端展示 后台展示 项目说明 项目目录 ├── film 前端页面项目文件 …

HTML CSS JS游戏网页设计作业「响应式高端游戏资讯bootstrap网站」

&#x1f389;精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业…

windows上datax的使用记录

datax使记录 简介 https://github.com/alibaba/DataX DataX 是阿里云 DataWorks数据集成 的开源版本&#xff0c;在阿里巴巴集团内被广泛使用的离线数据同步工具/平台。DataX 实现了包括 MySQL、Oracle、OceanBase、SqlServer、Postgre、HDFS、Hive、ADS、HBase、TableStore(O…

[洛谷]P1449 后缀表达式

[洛谷]P1449 后缀表达式一、问题描述&#xff1a;题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1提示二、思路分析1、算法标签2、思路三、代码实现一、问题描述&#xff1a; 传送门&#xff1a;[洛谷]P1449 后缀表达式 题目描述 所谓后缀表达式是指这样的一个表达式…

DJ14 简单接口电路及应用

目录 一、I/O 接口 1. 接口和端口的关系 2. 接口的基本结构 3. 8086/8088 端口编址 二、简单接口芯片 1. 74LS244 三态门 2. 74LS273 锁存器 3. 74LS374锁存器 4. 综合应用 三、基本输入输出方式 1. 无条件传送方式 2. 查询工作方式 一、I/O 接口 1. 接口和端口的…

校招面试真题 | 你的期望薪资是多少?为什么?

很多人去面试的时候&#xff0c;就像打游戏&#xff0c;过五关斩六将&#xff0c;终于到最后一关了&#xff0c;但是谈薪资的难度堪比打游戏中搞定终级 boss 的难度&#xff0c;真的是太「南」了&#xff0c;好多人都是因为这个问题让自己五味杂陈呀。报高了怕好 offer 失之交臂…