CSS3 立体 3D 变换


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


文章目录

  • [✍CSS3 立体 3D 变换](#✍CSS3 立体 3D 变换)
    • [💎1 坐标轴](#💎1 坐标轴)
    • [💎2 perspective 透视视图](#💎2 perspective 透视视图)
      • [🌹2.1 perspective-origin](#🌹2.1 perspective-origin)
    • [💎3 旋转](#💎3 旋转)
    • [💎5 transform-style 语法](#💎5 transform-style 语法)
    • [💎6 transform-origin](#💎6 transform-origin)
    • [💎7 平移](#💎7 平移)
    • [💎8 缩放](#💎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);
}
相关推荐
李明卫杭州几秒前
CSS BFC 完全指南:从原理到实战,彻底搞懂这个"结界"
前端
Momo__2 分钟前
MDN MCP Server——Mozilla 把 Web 文档接进 AI Agent,从此 LLM 不再瞎编 API
前端·ai编程·mcp
妙码生花2 分钟前
现代前端的极致性能 icon 加载方案(死磕成功版)
前端·vue.js·typescript
掘金者阿豪1 小时前
把业务数据变成共享仪表盘:Metabase可视化与远程访问实践
前端·后端
kyriewen1 小时前
折腾了半年 AI 编程工作流,最后发现效率瓶颈是桌上那块屏幕
前端·javascript·ai编程
蜗牛前端2 小时前
codex 全流程开发上线的高颜值礼簿小程序
前端·微信小程序
大龄秃头程序员2 小时前
我在图文流 App 里落地双层缓存、弱网降级与 OOM 治理
前端
老王以为2 小时前
React Renderer 分离的多平台架构
前端·react native·react.js
hunterandroid2 小时前
Kotlin Coroutines 与 Flow:让异步任务更清晰
前端
Bigger3 小时前
从零搭建 AI 代码审查服务:一份前端也能看懂的 Python 学习笔记
前端·ci/cd·ai编程