css3新特性第七章(3D变换)

css新特性第七章(3D变换)

一、3d空间和景深

元素进行 3D 变换的首要操作:父元素必须开启 3D 空间!

使用 transform-style 开启 3D 空间,可选值如下:

  • flat : 让子元素位于此元素的二维平面内( 2D 空间)------ 默认值
  • preserve-3d : 让子元素位于此元素的三维空间内( 3D 空间)

景深

何为景深?------ 指定观察者与 z=0 平面的距离,能让发生 3D 变换的元素,产生透视效果,看来更加立

体。

  • perspective
    • none : 不指定透视 ------(默认值)
    • 长度值 : 指定观察者距离 z=0 平面的距离,不允许负值。
  • perspective 设置给发生 3D 变换元素的父元素!

基础html结构

markdown 复制代码
  .outer {
       width: 200px;
       height: 200px;
       border: 2px solid black;
       font-size: 30px;
       text-align: center;
       line-height: 200px;
       margin: 0 auto;
       margin-top: 100px;

       /* 父元素需要开启3d空间 */
       transform-style: preserve-3d;
       /* 设置景深   近大远小  必须要设置在父元素上面 */
       perspective: 150px;
     }
 <div class="outer">
        <div class="inner">3D变换</div>
    </div>

设置 rotateX 旋转效果

代码

.inner {

​ width: 200px;

​ height: 200px;

​ background-color: palegreen;

​ /* 设置x轴旋转 类似于体操运动员,一直在单杠上面上下 */

​ transform: rotateX(50deg);

}

设置rotateY 旋转效果

代码

.inner {

​ width: 200px;

​ height: 200px;

​ background-color: palegreen;

​ /* 设置Y轴旋转 类似于旋转,沿着柱子左右方向 */

​ transform: rotateY(50deg);

}

总结

我们发现,当我们设置了 perspective 的参数大小会发现,我们数值设置的越小,那么我们看到的z轴面积就越大,改值跟我们眼睛看东西一样,越近对应看到的物体也就越大,数字越小就代表越近,因为只有旋转效果是最好的,位移和缩放是看不出来的,因为没有厚度

二、透视点位置

所谓透视点位置,就是观察者位置;默认的透视点在元素的中心。通常我们不需要跳转透视点位置;

  • perspective-origin
  • 400px 300px 相对坐标轴往右偏移400px, 往下偏移300px(相当于人蹲下300像素,然后向右移动400像素看元素)

默认效果

代码

markdown 复制代码
 <style>
     .outer {
       width: 200px;
       height: 200px;
       border: 2px solid black;
       font-size: 30px;
       text-align: center;
       line-height: 200px;
       margin: 0 auto;
       margin-top: 100px;

       /* 父元素需要开启3d空间 */
       transform-style: preserve-3d;
       /* 设置景深   近大远小  必须要设置在父元素上面 */
       perspective: 500px;
       /* 修改透视点位置 默认是正中央 */
       /* perspective-origin: 102px 102px; */

       /* 透视点位置  x 轴代表是右下角   y代表底下蹲下来看 */
       /* perspective-origin: 400px 300px; */
     }

     .inner {
       width: 200px;
       height: 200px;
       background-color: rgb(60, 209, 209,0.7);


       /* 设置x轴旋转    */
       transform: rotateX(50deg);

        /* 设置Y轴旋转    类似于旋转,沿着柱子左右方向 */
        /* transform: rotateY(50deg); */
     }

  </style>
</head>
<body>
    <div class="outer">
        <div class="inner">3D透视</div>
    </div>
</body>

设置透视点位置

perspective-origin: 400px 300px; 透视点位置 x 轴代表是右下角 y代表底下蹲下来看

rotateX 效果

.inner {

​ width: 200px;

​ height: 200px;

​ background-color: rgb(60, 209, 209,0.7);

​ /* 设置x轴旋转 */

​ transform: rotateX(50deg);

}

rotateY 效果

transform: rotateY(50deg);

三、3D位移

3D 位移是在 2D 位移的基础上,可以让元素沿 z 轴位移,具体使用方式如下:

  1. 先给元素添加 转换属性 transform

  2. 编写 transform 的具体值, 3D 相关可选值如下:

    含义
    translateZ 设置 z 轴位移,需指定长度值,正值向屏幕外,负值向屏幕里,且不能 写百分比。
    translate3d 第1个参数对应 x 轴,第2个参数对应 y 轴,第3个参数对应 z 轴,且均 不能省略。

html基本结构

markdown 复制代码
  .outer {
       width: 200px;
       height: 200px;
       border: 2px solid black;
       font-size: 30px;
       text-align: center;
       line-height: 200px;
       margin: 0 auto;
       margin-top: 100px;

       /* 父元素需要开启3d空间 */
       transform-style: preserve-3d;
       /* 设置景深   近大远小  必须要设置在父元素上面 */
       perspective: 500px;
       /* 修改透视点位置 默认是正中央 */
       perspective-origin: 259px 226px;

     }
 <div class="outer">
        <div class="inner">3D位移</div>
    </div>

写法1:translateZ

.inner {

​ width: 200px;

​ height: 200px;

​ background-color: rgba(87, 62, 230, 0.8);

​ /* 写法1 z 轴 我们可以看到是放大了 实际上是从里面出来*/

​ transform: translateZ(150px);

​ /* 增加阴影 */

​ box-shadow: 0px 0px 10px black;

}

写法2:transform

x 轴 y 轴 z轴 三个参数都不能省

transform: translate3d(100px,100px,100px);

总结

我们看到的第一眼以为是一个放大,实际上不是的,位移后,原本盒子没有厚度导致我们以为只是放大,这个时候我们需要调整透视点位置即可

四、3D选择

旋转是这些效果中最明显的。

3D 旋转是在 2D 旋转的基础上,可以让元素沿 x 轴和 y 轴旋转,具体使用方式如下:

复制代码
1. 先给元素添加 转换属性 transform
2. 编写 transform 的具体值, 3D 相关可选值如下:
含义
rotateX 设置 x 轴旋转角度,需指定一个角度值( deg ),面对 x 轴正方向:正值顺时针,负 值逆时针。
rotateY 设置 y 轴旋转角度,需指定一个角度值( deg ),面对 y 轴正方向:正值顺时针,负 值逆时针。
rotate3d 前 3 个参数分别表示坐标轴: x , y , z ,第 4 个参数表示旋转的角度,参数不允 许省略。 例如: transform: rotate3d(1,1,1,30deg) ,意思是: x 、 y 、 z 分别旋转 30 度。

rotateX

沿着x轴开启3d空间

效果

代码

markdown 复制代码
  .outer {
       width: 200px;
       height: 200px;
       border: 2px solid black;
       font-size: 30px;
       text-align: center;
       line-height: 200px;
       margin: 0 auto;
       margin-top: 100px;

       /* 父元素需要开启3d空间 */
       transform-style: preserve-3d;
       /* 设置景深   近大远小  必须要设置在父元素上面 */
       perspective: 500px;
       /* 修改透视点位置 默认是正中央 */
       perspective-origin: 102px 102px;

     }

     .inner {
       width: 200px;
       height: 200px;
       background-color: rgb(167, 248, 44,0.9);
       /* x 轴 顺时针 */
       /* transform: rotateX(45deg) */

        /* y 轴 顺时针 */
        /* transform: rotateY(45deg); */

        /* 写法3  写的是4个值  x y z  旋转角度   */
        transform: rotate3d(1,0,1,30deg);


     }
<div class="outer">
        <div class="inner">3D旋转</div>
    </div>

rotateY

沿着y轴进行旋转

效果

代码

markdown 复制代码
 /* y 轴 顺时针 */
        transform: rotateY(45deg);

rotate3d

复合属性写法 写的是4个值 x y z 旋转角度

transform: rotate3d(1,0,1,50deg);

五、3D缩放

3D 缩放是在 2D 缩放的基础上,可以让元素沿 z 轴缩放,具体使用方式如下:

  1. 先给元素添加 转换属性 transform
  2. 编写 transform 的具体值, 3D 相关可选值如下:
含义
scaleZ 设置 z 轴方向的缩放比例,值为一个数字, 1 表示不缩放,大于 1 放大,小 于 1 缩小。
scale3d 第1个参数对应 x 轴,第2个参数对应 y 轴,第3个参数对应 z 轴,参数不允许 省略。

代码结构

markdown 复制代码
<style>
     .outer {
       width: 200px;
       height: 200px;
       border: 2px solid black;
       font-size: 30px;
       text-align: center;
       line-height: 200px;
       margin: 0 auto;
       margin-top: 100px;

       /* 父元素需要开启3d空间 */
       transform-style: preserve-3d;
       /* 设置景深   近大远小  必须要设置在父元素上面 */
       perspective: 500px;
       /* 修改透视点位置 默认是正中央 */
       perspective-origin: 102px 102px;

     }

     .inner {
       width: 200px;
       height: 200px;
       background-color: rgb(167, 248, 144,0.9);
       
       /* 写法1  scaleZ我们看到好像没有效果,我们调转旋转角度看  如果真的有厚度,到90度那么就可以看得到 */
       transform: scaleZ(4) rotateY(45deg);

       /* 写法2  最后一个参数是景深除以 最后一个参数,代表的就是离得近了*/
       transform: scale3d(1.5,1.5,4) rotateY(45deg);
     }

  </style>
</head>
<body>
    <div class="outer">
        <div class="inner">3D缩放</div>
    </div>

scaleZ

scaleZ我们看到好像没有效果,这个时候我们调整一下角度再看效果

  • transform: scaleZ(4) rotateY(45deg);

scale3d

最后一个参数是景深除以 最后一个参数,代表的就是离得近了

transform: scale3d(1.5,1.5,4) rotateY(45deg);

六、多重变换

我们同时使用多个属性同时实现变换,多重变换时,建议最后旋转。

方式1

transform-origin: left;

transform: rotateY(45deg);

方式2

y 轴线 右边 需要计算宽度

transform-origin: 200px 0px;

transform: rotateY(45deg);

方式3

/* 方式3 x 轴线 上方 */

​ transform-origin: 0px 0px;

​ transform: rotateX(45deg);

方式4

/* 方式4 x 轴线 下方 需要计算宽和高度 */

​ transform-origin: 202px 202px;

​ transform: rotateX(45deg);

方式5

位移 放大 旋转一起使用 旋转放到最后

/* 位移 放大 旋转一起使用 旋转放到最后 */

transform: translateZ(100PX) scaleZ(1.5) rotateY(45deg);

七、背部可见性

使用 backface-visibility 指定元素背面,在面向用户时是否可见,常用值如下:

  • visible : 指定元素背面可见,允许显示正面的镜像。------ 默认值
  • hidden : 指定元素背面不可见

** backface-visibility 需要加在发生 3D 变换元素的自身上。**

效果

代码

markdown 复制代码
<style>
     .outer {
       width: 200px;
       height: 200px;
       border: 2px solid black;
       font-size: 30px;
       text-align: center;
       line-height: 200px;
       margin: 0 auto;
       margin-top: 100px;

       /* 父元素需要开启3d空间 */
       transform-style: preserve-3d;
       /* 设置景深   近大远小  必须要设置在父元素上面 */
       perspective: 500px;
       /* 修改透视点位置 默认是正中央 */
       perspective-origin: 102px 102px;

     }

     .inner {
       width: 200px;
       height: 200px;
       background-color: rgba(240, 35, 161, 0.9);

       /* 越过90度,背后不能看到 */
       backface-visibility: hidden;

       /* 旋转y轴 */
       transform: rotateY(40deg);
     }

  </style>
</head>
<body>
    <div class="outer">
        <div class="inner">3D背部可见性</div>
    </div>
相关推荐
HtwHUAT7 分钟前
五、web自动化测试01
前端·css·chrome·python·功能测试·selenium·html
86Eric10 分钟前
Vue 中 使用 Mixins 解决 多页面共用相同组件的相关问题
前端·javascript·vue.js·mixins·公用组件
qq_252496399622 分钟前
react 子组件暴露,父组件接收
前端·javascript·react.js
fakaifa25 分钟前
【最新版】西陆健身系统源码全开源+uniapp前端
前端·小程序·uni-app·开源·php·约课小程序·健身小程序
南囝coding30 分钟前
关于我的第一个产品!
前端·后端·产品
iOS阿玮37 分钟前
别等了,今天是Xcode15时代的最后一天。
前端·app·apple
沙尘暴炒饭43 分钟前
vuex持久化vuex-persistedstate,存储的数据刷新页面后导致数据丢失
开发语言·前端·javascript
2401_837088501 小时前
CSS清楚默认样式
前端·javascript·css
zwjapple1 小时前
React 的 useEffect 清理函数详解
前端·react.js·前端框架
Jewel1051 小时前
如何配置Telegram Mini-App?
前端·vue.js·app