CSS3 立体 3D 变换

server/2024/10/18 20:21:08/

个人主页:学习前端的小z
个人专栏:HTML5和CSS3悦读
本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结,欢迎大家在评论区交流讨论!


文章目录

  • ✍CSS3 立体 3D 变换
    • 💎1 坐标轴
    • 💎2 perspective 透视视图
      • 🌹2.1 perspective-origin
    • 💎3 旋转
    • 💎5 transform-style 语法
    • 💎6 transform-origin
    • 💎7 平移
    • 💎8 缩放

✍CSS3 立体 3D 变换

在这里插入图片描述

💎1 坐标轴

什么是3D的场景呢?2D场景,在屏幕水平和垂直的交叉轴线x轴和y轴。

3D场景,在垂直于屏幕的方法,相对于3D多出个Z轴。

Z轴:靠近屏幕的方向是正向,远离屏幕的方向是反向。

在这里插入图片描述

CSS3中的3D变换主要包括以下几种功能函数:

3D位移

  • CSS3中的3D位移主要包括translateZ()和translate3d(x,y,z)两个功能函数;

3D旋转

  • CSS3中的3D旋转主要包括rotateX()、rotateY()、rotateZ()和rotate3d()四个功能函数;
  • 在2D中,只有 rotate(30deg)

3D缩放

  • CSS3中的3D缩放主要包括scaleZ()和scale3d()两个功能函数;

3D透视视图

  • CSS3中的3D转换元素定义透视视图,主要包括perspective(n)函数或者perspective属性;

💎2 perspective 透视视图

perspective 透视视图也可以就叫做视距、景深。

如果没有定义 perspective 视距,就相当于没有近大远小。

满足下面两个设置,才会产生近大远小的感观:

  • 设置 perspective 视距
  • 必须在 z 轴上面有变换(平移、旋转、缩放)

在这里插入图片描述

程序中实现的方法 perspective 元素距离,视线的距离(物体和眼睛的距离越小,近大远小的效果越明显):

  • perspective: 1200px;(在父盒子中使用)
  • transform: perspective(1200px);(在子元素中使用)

两个都设置会发生冲突,建议只设置父元素,通常的数值在900~1200之间。

如果当你的视线距离物体足够远的时候,基本上就不会有近大远小的感觉。

🌹2.1 perspective-origin

perspective-origin 属性:定义一个观察者的角度。

默认情况下,坐标系的 Z 轴位于父元素的水平中线与垂直中线的交界处。

我们可以通过设置 perspective-origin 来调整位置,使用绝对定位样式移动元素时,此时坐标系的 X 轴和 Y 轴以设置了相对定位的祖先元素的中点为原点。

在这里插入图片描述

要注意的是,在调整 z 轴的位置的时候,用户的视角也会跟着发生变化。

perspective-origin 属性可以定义一个观察者的角度,俯视、仰视、左右侧视等等。

perspective-origin 属性有两个值,取值有3种方式:长度、百分比、方位单词。

取值:

  • perspective-origin: x轴距离 y轴距离;
  • perspective-origin: x轴百分比 y轴百分比; 默认观察源为 50% 50%,父元素的中心点
  • perspective-origin: 方位单词1 方位单词2; 方位单词:top、bottom、center、left、right
  • 若只设置了一个值,则第二个值默认为 50%

💎3 旋转

https://virtual.bbcmic.ro/?disc1=elite.ssd&autoboot

rotateX|Y|Z()方法,在一个给定度数顺时针旋转的元素。负值是允许的,这样是元素逆时针旋转。

左手法则:

css">transform: rotateX(30deg); /*在3D空间内,沿着x轴顺时针旋转*/
transform: rotateY(30deg); /*在3D空间内,沿着y轴顺时针旋转*/
transform: rotateZ(30deg); /*在3D空间内,沿着z轴顺时针旋转*/rotate3d(1,1,1, 30deg); /*3d绘制软件,它自动生成向量坐标*/
/*
x,y,z的取值为0~1
rotate3d(1,1,1, 30deg) --------->表示x,y,z与30deg的乘积,rotateX(30deg)、rotateY(30deg)、rotateZ(30deg)
rotate3d(0,0,1, 30deg) --------->表示x,y,z与30deg的乘积,rotateX(0)、rotateY(0)、rotateZ(30deg)
*/

如果需要复杂的3d效果,一般都会使用3D绘制软件,3dmax,uity ----> .obj ----> 3d图形

怎么查看旋转的3d效果,一般会开启perspective视距,有一个远小近大。

💎5 transform-style 语法

使被转换的子元素保留其 3D 转换,给需要 3D 变换的父(上一级或者上上级)元素设置

css">transform-style: flat|preserve-3d;
描述
flat子元素将不保留其 3D 位置。2D舞台
preserve-3d子元素将保留其 3D 位置。3D舞台

transform-style: preserve-3d 能使在同一位置的元素中心点交汇。自然 flat 值就是不能够交汇咯。

只要CSS绘制3D图形,这个transform-style必须加上,perspective可以选择性的添加。

💎6 transform-origin

描述
x-axis定义视图被置于 X 轴的何处。可能的值:left、center、right、length、%
y-axis定义视图被置于 Y 轴的何处。可能的值:top、center、bottom、length、%
z-axis定义视图被置于 Z 轴的何处。可能的值:length

示例:

css">/* 将 z轴的原点坐标设置为+50px,相当于这时候原点坐标向我们眼睛靠近50px这时候加上景深的100px,相当于我们距离屏幕为150px了。
*/
transform: perspective(100px);
transform-origin: 50% 50% 50px;

transform-origin其实和视距也是有关系的。

💎7 平移

translate()方法,根据左(X 轴)和顶部(Y 轴)位置给定的参数,从当前元素位置移动。

css">transform: translateX(30px);
transform: translateY(30px);
transform: translateZ(30px);translate3d(x,y,z);

💎8 缩放

CSS3 3D变形中的缩放主要有scaleZ()和scale3d()两种函数,当scale3d()中x轴和y轴同时为1,即scale3d(1,1,sz),其效果等同于scaleZ(sz)。通过使用3D缩放函数,可以让元素在Z轴上按比例缩放。默认值为1,当值大于1时,元素放大,反之小于1大于0.01时,元素缩小

scale3d(sx,sy,sz)

  • sx:横向缩放比例
  • sy:纵向缩放比例
  • sz:Z轴缩放比例

scaleZ(s)

  • s:指定元素每个点在Z轴的比例
  • scaleZ(z)是难点,指的z轴方向上的纵深(视距),并不会在z轴方向加厚元素,需要在父元素设置,然后观察子元素位移距离的增加
css">/*为什么它不会产生任何效果?*/
transform: perspective(100px) scaleZ(2);
原因就是没有产生近大远小,至少来说,必须要通过其他的变形函数产生近大远小才可以看到效果正确示例:transform: perspective(100px) scaleZ(2) translateZ(1px);

注意:scaleZ()和scale3d()函数单独使用时没有任何效果,需要配合其他的变形函数一起使用才会有效果

scaleZ需要配合 perspective 和 rotateX(45deg) 观看效果。

css">.box {transform-style: preserve-3d;perspective: 800px;
}.center {transform: scaleZ(10) rotateX(45deg);
}/*or*/.box {transform-style: preserve-3d;
}
.center {transform: perspective(800px) scaleZ(10) rotateX(45deg);
}

http://www.ppmy.cn/server/4623.html

相关文章

如何使用ChatGPT仿写一篇学术论文

点击下方▼▼▼▼链接直达AIPaperPass ! AIPaperPass - AI论文写作指导平台 目录 1.仿写的目的 2.根据专业方向搜集合适的文献 3.总结想要仿写的文献 4.使用ChatGPT一步一步仿写 5.书籍介绍 AIPaperPass智能论文写作平台 深入地阅读和分析你研究领域的相关文…

园区巡检机器人能解决哪些问题?

在当今城市化快速发展的背景下,园区管理成为了城市管理的重要组成部分。然而,随着园区规模的不断扩大和管理需求的日益增加,传统的园区巡检方式已经无法满足对园区安全、环境监测和设施维护的需求。人工巡检存在着效率低、覆盖范围有限、安全…

关于java数据样品以及转换

关于集合 List<String> List<String> list duoMapper.selectName(); [ "alice1", "alice2", "alice3", "alice4", "alice5", "alice6", "alice7", "alice8",…

新项目应该选mongodb还是postgresql?

文章目录 MongoDBPostgreSQL大数据处理时的优势对比实际使用经验 选择MongoDB还是PostgreSQL作为新项目的数据库&#xff0c;主要取决于项目的具体需求、数据模型、应用场景以及团队熟悉程度等因素。下面将从几个关键角度对两者进行对比分析。 MongoDB 数据模型&#xff1a;Mo…

OSPF动态路由实验(思科)

华为设备参考&#xff1a;OSPF动态路由实验&#xff08;华为&#xff09; 一&#xff0c;技术简介 OSPF&#xff08;Open Shortest Path First&#xff09;是一种内部网关协议&#xff0c;主要用于在单一自治系统内决策路由。它是一种基于链路状态的路由协议&#xff0c;通过…

REACT+PHP课程项目血泪史

PHP php??老师让用php写后端。什么&#xff1f;写惯了java、python。这个看起来像html标签语言的东西写后端是个什么鬼&#xff0c;看起来想落后几千年的原始语言&#xff08;手动滑稽&#xff09;。 大概介绍一下&#xff0c;php主要是后端语言&#xff0c;用来连接数据库…

消息队列的简介

什么是消息队列? 消息队列就是用于不同系统 不同服务之间异步地传递信息,就是不用生产者和消费者同时在线或者直接连接,消息存储在队列中,直到消费者准备处理 消息队列的核心概念: 生产者:发送消息的一方 消费者:处理消息的一方 队列:存储队列的一方 优点: 1解耦: 生产者和消费…

Python基础02-掌握HTTP API的秘诀

在下面文案基础上扩展&#xff0c;写一篇技术博客&#xff0c;标题要有吸引力&#xff1f; 标题&#xff1a; 在Python中&#xff0c;使用HTTP API已成为一种常见的操作。本文将深入探讨如何使用Python的requests库与HTTP API进行交互。我们将学习如何发送GET和POST请求、处理…