CSS3之transform属性-3D转换

三维坐标系

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

3D旋转左手准则

  • 左手的手拇指指向旋转轴的正方向
  • 其余手指弯曲方向就是该元素沿着该旋转轴旋转的方向(正值方向)
     

transform:

作用:
         该属性可以将元素旋转、缩放、移动、倾斜等
说明:
         应用于元素的2D3D转换
常用值:
         (none):定义不进行转换
         (translate):定义2d位移,向右、向下为正值;向左、向上为负值
         (translate3d):定义3d位移
         (translateX):定义关于x轴的位移
         (translateY):定义关于y轴的位移
         (translateZ):定义关于z轴的位移
         (rotate):定义2d旋转,顺时针为正值;逆时针为负值
         (rotate3d):定义3d旋转
         (rotateX):定义关于x轴的旋转
         (rotateY):定义关于y轴的旋转
         (rotateZ):定义关于z轴的旋转
         (scale):定义2d缩放,0 - 1缩小,1 - +∞放大
         (scale3d):定义3d缩放
         (scaleX):定义关于x轴的缩放
         (scaleY):定义关于y轴的缩放
         (scaleZ):定义关于z轴的缩放
 

transform-origin:

作用:
         改变元素转换的中心位置
说明:
         2D转换元素可以改变元素的X和Y轴。 3D转换元素,还可以更改元素的Z轴,使用此属性必须先使用transform属性
常用值:
         (x-axis):定义关于x轴的旋转中心,left、center、right、length、百分比
         (y-axis):定义关于y轴的旋转中心,left、center、right、length、百分比
         (z-axis):定义关于z轴的旋转中心,left、center、right、length、百分比
 

transform-style:

作用:
         指定子元素应该怎样在三维空间中显示(三维属性)
说明:
         控制子元素是否开启三维立体环境,代码写给父级,但是影响的是子盒子
常用值:
         (flat):指定所有子元素在以2D方式显示
         (preserve-3d):指定所有子元素在以3D方式显示
 

perspective:

作用:
         定义视距(视野距离,给3d转换留出的空间)(三维属性)
说明:
         该属性只影响3D转换元素,一般给3D转换元素的父级元素添加该属性
常用值:
         (none):默认值,与0相同,不设置透视
         (NUMBER):元素距离视图的距离,以像素计
注意:
         如果想要网页产生3D效果需要透视(理解成3D物体投影的2D平面上),实际上是模仿人类的视觉位置,可理解为安排一直眼睛去看透视也称为视距,所谓的视距就是人的眼睛到屏幕的距离,距离视觉点越近的在电脑平面成像越大,越远成像越小,透视的单位是像素

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>CSS3之3D转换属性</title>
    
    <style type="text/css">
        body {
            height: 1500px;
        }
        .show {
            /* 定义视距 */
            perspective: 500px;
        }
        .show>div {
            width: 200px;
            height: 200px;
            margin: 50px auto 0;
            transition: all 1s;
        }
        
        .div1 {
            background-color: skyblue;
        }
        .div1:hover {
            /* 定义在x轴上的位移 */
            /*transform: translateX(100px);*/
            /* 定义在y轴上的位移 */
            /*transform: translateY(100px);*/
            /* 定义在z轴上的位移 */
            /*transform: translateZ(100px);*/
            /* 同时使用 */
            /*transform: translateX(100px) translateY(100px) translateZ(100px);*/
            /* 合并写法 */
            transform: translate3d(100px, 100px, 100px);
        }
        
        .div2 {
            background-color: mediumpurple;
        }
        .div2:hover {
            /* 定义在x轴上的旋转 */
            /*transform: rotateX(180deg);*/
            /* 定义在y轴上的旋转 */
            /*transform: rotateY(180deg);*/
            /* 定义在z轴上的旋转 */
            /*transform: rotateZ(180deg);*/
            /* 同时使用 */
            /*transform: rotateX(180deg) rotateY(180deg) rotateZ(180deg);*/
            /* 合并写法 */
            transform: rotate3d(1, 1, 1, 180deg);
        }
        
        .div3 {
            background-color: coral;
        }
        .div3:hover {
            /* 定义在x轴上的缩放 */
            /*transform: scaleX(2);*/
            /* 定义在y轴上的缩放 */
            /*transform: scaleY(2);*/
            /* 定义在z轴上的缩放 */
            /*transform: scaleZ(2);*/
            /* 同时使用 */
            /*transform: scaleX(2) scaleY(2) scaleZ(2);*/
            /* 合并写法 */
            transform: scale3d(2, 2, 2);
        }
        
        .container1 {
            position: relative;
            width: 400px;
            height: 400px;
            margin: 30px auto;
            transition: all 20s;
            
            /* 定义视距 */
            perspective: 500px;
            /* 定义子元素3D呈现 */
            transform-style: preserve-3d;
        }
        .container1:hover {
            transform: rotateY(360deg);
        }
        div.div4,
        div.div5 {
            position: absolute;
            top: 100px;
            left: 100px;
            width: 200px;
            height: 200px;
        }
        .div4 {
            background-color: goldenrod;
        }
        .div5 {
            background-color: lightseagreen;
            transform: rotateX(80deg);
        }
    </style>
</head>
<body>
    <div class="show">
        <div class="div1"></div>
        <hr>
        <div class="div2"></div>
        <hr>
        <div class="div3"></div>
        <hr>
    </div>
    <div class="container1">
        <div class="div4"></div>
        <div class="div5"></div>
    </div>
</body>
</html>

 

案例1:两面牌

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>3D案例1 两面牌</title>
    
    <style type="text/css">
        .container {
            position: relative;
            margin: 200px auto;
            transition: all 8s;
            /*添加透视*/
            perspective: 500px;
            /*子元素3D显示*/
            transform-style: preserve-3d;
        }
        .container:hover {
            transform: rotateY(180deg);
        }
        .container div {
            position: absolute;
            top: 0;
            left: 50%;
            width: 200px;
            height: 200px;
            margin-left: -100px;
            border-radius: 50%;
            color: white;
            font-size: 25px;
            line-height: 200px;
            letter-spacing: 10px;
            text-align: center;
        }
        .container div.front {
            background-color: #4fbfff;
        }
        .container div.verso {
            background-color: lightseagreen;
            transform: rotateY(180deg);
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="front">我是正面</div>
        <div class="verso">我是反面</div>
    </div>
</body>
</html>

在这里插入图片描述
 

案例2:导航栏

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>3D案例2 导航栏</title>
    
    <style type="text/css">
        nav li {
            position: relative;
            float: left;
            width: 170px;
            height: 50px;
            margin-right: 30px;
            list-style: none;
            /* 添加视距 */
            perspective: 500px;
        }
        nav li .box {
            width: 100%;
            height: 100%;
            /* 开启子元素3D显示*/
            transform-style: preserve-3d;
            /* 过渡时间 */
            transition: all .4s;
        }
        nav li .box:hover {
            /* 向后旋转90度 */
            transform: rotateX(90deg);
        }
        nav li .box div {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            color: white;
            font: normal 700 20px 幼圆, serif;
            letter-spacing: 5px;
            line-height: 50px;
            text-align: center;
        }
        nav li .box div.front {
            background-color: #1075ff;
            transform: translateZ(25px);
        }
        nav li .box div.below {
            background-color: limegreen;
            transform: translateY(25px) rotateX(-90deg);
        }
    </style>
</head>
<body>
<nav>
    <ul>
        <li>
            <div class="box">
                <div class="front">这是前面</div>
                <div class="below">这是下面</div>
            </div>
        </li>
        <li>
            <div class="box">
                <div class="front">这是前面</div>
                <div class="below">这是下面</div>
            </div>
        </li>
        <li>
            <div class="box">
                <div class="front">这是前面</div>
                <div class="below">这是下面</div>
            </div>
        </li>
        <li>
            <div class="box">
                <div class="front">这是前面</div>
                <div class="below">这是下面</div>
            </div>
        </li>
        <li>
            <div class="box">
                <div class="front">这是前面</div>
                <div class="below">这是下面</div>
            </div>
        </li>
        <li>
            <div class="box">
                <div class="front">这是前面</div>
                <div class="below">这是下面</div>
            </div>
        </li>
    </ul>
</nav>
</body>
</html>

在这里插入图片描述
 

案例3:立方体

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>3D案例3 立方体</title>
    
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }
        body {
            height: 1000px;
        }
        /* 定义动画 */
        @keyframes rotation {
            0% {}
            100% {
                transform: rotate3d(0.4, 0.6, 0.2, 360deg);
            }
        }
        .container {
            /* 添加视距 */
            perspective: 1000px;
        }
        .container .box {
            position: relative;
            width: 600px;
            height: 600px;
            margin: 100px auto;
            transition: all 6s;
            /* 开启子元素3D显示 */
            transform-style: preserve-3d;
            /* 添加动画 */
            animation: rotation 12s linear 0s normal infinite;
        }
        .container .box div {
            position: absolute;
            top: 100px;
            left: 100px;
            width: 400px;
            height: 400px;
            color: white;
            font-size: 50px;
            font-weight: 700;
            line-height: 400px;
            text-align: center;
            
        }
        .container .box div:nth-child(1) {
            background-color: red;
            transform: translateZ(200px);
        }
        .container .box div:nth-child(2) {
            background-color: orange;
            transform: translateZ(-200px) rotateY(180deg);
        }
        .container .box div:nth-child(3) {
            background-color: yellow;
            transform: translateX(-200px) rotateY(-90deg);
        }
        .container .box div:nth-child(4) {
            background-color: limegreen;
            transform: translateX(200px) rotateY(90deg);
        }
        .container .box div:nth-child(5) {
            background-color: dodgerblue;
            transform: translateY(-200px) rotateX(90deg);
        }
        .container .box div:nth-child(6) {
            background-color: mediumpurple;
            transform: translateY(200px) rotateX(-90deg);
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="box">
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
        </div>
    </div>
</body>
</html>

在这里插入图片描述
 

案例4:旋转木马

<!DOCTYPE html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <title>3D案例4 旋转木马</title>
    
    <script type="text/javascript">
        // 定时刷新页面
        window.setTimeout(function(){
            window.location.reload();
        }, 14000);
    </script>
    
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }
        body {
            overflow: hidden;
            background-color: #666666;
        }
        /* 定义动画1 */
        @keyframes rotation {
            0% {}
            100% {
               transform: rotateY(1turn);
            }
        }
        /* 定义动画2 */
        @keyframes rotate-big {
            0% {
                transform: translateY(400px) scale3d(0.1, 0.1, 0.1) rotateY(-6turn);
            }
            100% {
                transform: translateY(0) scale3d(1, 1, 1) rotateY(-2turn);
            }
        }
        
        .container {
            /* 添加视距 */
            perspective: 1000px;
        }
        .container .box {
            position: relative;
            width: 1200px;
            height: 400px;
            margin: 200px auto;
            /* 对子元素开启3D显示 */
            transform-style: preserve-3d;
            /* 添加动画 语法格式:animation: name duration timing-function delay iteration-count direction fill-mode play-state;*/
            animation: rotate-big 2s ease-out 0s 1 normal,
                       rotation 12s linear 2s infinite normal;
        }
        .container .box:hover {
            /* 暂停动画 */
            animation-play-state: paused;
        }
        .container .box div {
            position: absolute;
            top: 100px;
            left: 450px;
            width: 300px;
            height: 200px;
            box-shadow: 0 0 10px 0 #DEE2F3;
        }
        .container .box div:nth-child(1){
            background-color: red;
            transform: rotateY(0deg) translateZ(400px);
        }
        .container .box div:nth-child(2){
            background-color: orange;
            transform: rotateY(60deg) translateZ(400px);
        }
        .container .box div:nth-child(3){
            background-color: yellow;
            transform: rotateY(120deg) translateZ(400px);
        }
        .container .box div:nth-child(4){
            background-color: limegreen;
            transform: rotateY(180deg) translateZ(400px);
        }
        .container .box div:nth-child(5){
            background-color: cyan;
            transform: rotateY(240deg) translateZ(400px);
        }
        .container .box div:nth-child(6){
            background-color: blue;
            transform: rotateY(300deg) translateZ(400px);
        }
        .container .box div:nth-child(7){
            background-color: purple;
        }
    </style>
</head>
<body>
    <div class="container">
        <div class="box">
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
            <div></div>
        </div>
    </div>
</body>
</html>

在这里插入图片描述

  • 6
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: transform-style: preserve-3d; 是一个CSS3属性,用于定义一个元素的子元素是如何在三维空间中呈现的。 当应用于一个元素时,它指示该元素的子元素应该在三维空间中进行变换,而不是在二维平面中变换。这意味着子元素可以在三维空间中进行旋转、缩放和移动,而不受到其父元素的影响。 例如,如果一个元素有许多子元素,当应用 transform-style: preserve-3d; 后,这些子元素将会在三维空间中摆放,这样它们可以以更自由的方式进行旋转和变形,而不会受到其父元素的影响。 需要注意的是,使用 transform-style: preserve-3d; 属性时,父元素必须具有透视属性(perspective),否则子元素将无法正确呈现在三维空间中。 ### 回答2: transform-style: preserve-3d; 是一个CSS属性,用于控制3D变换元素内容的呈现方式。 当使用3D变换属性(如rotateX、rotateY等)来转换一个元素时,该元素的子元素也会被影响,它们可能会在3D空间中随着父元素的变换发生改变。但是,默认情况下,子元素的变换发生在二维平面上,即使父元素发生了3D变换。 使用transform-style: preserve-3d; 可以改变子元素的变换方式,使其也在3D空间中进行变换。这意味着子元素可以跟随父元素的旋转和变换,并在3D空间中自由移动。 此属性对于制作3D效果的网页或动画非常有用。例如,在一个3D立方体中,可以通过设置父元素的transform-style为preserve-3d,使得立方体内的内容也在3D空间中进行变换,从而创造出更加生动逼真的效果。 需要注意的是,transform-style: preserve-3d; 只会应用在直接子元素上,对于孙元素或更深层次的元素,需要单独设置transform-style属性。 总之,通过使用transform-style: preserve-3d; 属性,可以在3D变换中更好地控制元素的呈现方式,增强网页或动画的视觉效果。 ### 回答3: transform-style: preserve-3d; 是CSS属性,用于定义一个元素的子元素应如何在3D空间中呈现。 当我们在 CSS 中使用 3D 转换时,通常会在某个容器元素上使用 transform-style: preserve-3d; 属性。这样可以确保容器元素的子元素能够保持其在3D空间中的位置和变换效果。 这个属性的默认值是 flat,即子元素在容器元素的平面内进行变换。而当我们将属性值设置为 preserve-3d 时,容器元素的子元素将以3D空间的形式进行变换,使得子元素可以具有在3D空间中移动、旋转和缩放的效果。 这个属性在进行复杂的3D转换时非常有用。通过将容器元素的子元素设置为 preserve-3d,我们可以在子元素上应用各种3D转换,例如 translate3D、rotate3D 和 scale3D 等。这样能够更加精确地控制子元素在3D空间中的位置和变换效果。 总之,transform-style: preserve-3d; 是一个非常有用的CSS属性,当我们需要在页面中创建3D效果时,可以使用它来确保容器元素的子元素能够正确地在3D空间中进行变换。通过合理运用这个属性,我们可以创造出令人惊叹的3D动画和效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值