3D

简称3维坐标系 比二维坐标系多一个Z轴

3D位移

3D位移在2D的根底上多一个可挪动的Z轴
  transform: translate3d(x,y,z);
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        * {            margin: 0;            padding: 0;        }                              .box {            width: 200px;            height: 200px;            background-color: blue;            /* 位移3D的写法 */            /* transform: translate3d(200px, 200px, 200px); */            /* 或者能够这样写 */            transform: translateX(400px) translateY(400px) translateZ(400px);        }    </style></head><body>    <div class="box"></div></body></html>


注意事项

  • x轴 Y轴个别用px 百分比来当作单位。
  • Z轴个别用px做单位 必须借助透视性能。
  • z轴向外挪动个别是正值,向内挪动是负值。

perspective

特点

  • 透视是视距,单位为px
  • 近大远小,透视写在被察看元素的父元素上。
  • 透视的单位越大,看到的物品就越小,透视的单位越小,看到的物品就越大。
  • 在透视固定的状况下,z轴越大,看到的物品就越大,z轴越小,看到的物品就越小。

在这张图中,d为透视,位于人的眼睛和被察看物体的两头,即近大远小

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        * {            margin: 0;            padding: 0;        }                body {            perspective: 500px;        }                .box {            width: 200px;            height: 200px;            margin: 200px auto;            background-color: blue;            transform: translateZ(100px);        }    </style></head><body>    <div class="box"></div></body></html>

3D旋转

3D 旋转指能够让元素在三维立体内沿着 x 轴、y 轴、z 轴 或者自定义轴进行旋转

rotateX

左手蜿蜒的手指方向即为x轴的正方向

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        * {            margin: 0;            padding: 0;        }                body {            /* 3D成果的实现,必须依赖于透视 */            perspective: 500px;        }                img {            display: block;            margin: 200px auto;            /* 设置圆角边框 */            border-radius: 50%;            /* 应用动画 */            animation: move 2s linear 0s infinite alternate;            /* 让元素居中对齐 */            margin: 200px auto;        }        /* 定义动画 */                @keyframes move {            form {                transform: rotateX(0deg);            }            to {                transform: rotateX(360deg);            }        }    </style></head><body>    <img src="./image/形象.jpg" alt=""></body></html>

rotateY

左手手指蜿蜒的方向即为y轴的正方向

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        * {            margin: 0;            padding: 0;        }                body {            /* 加此属性是为了更好的应用3d成果 */            perspective: 500px;        }                img {            /* 转换成块级元素 */            display: block;            /* 挪动的核心地位 */            margin: 200px auto;            /* 应用动画 */            animation: move 2s linear 0s infinite alternate;        }        /* 定义动画 */                @keyframes move {            0% {                transform: rotateY(0);            }            100% {                transform: rotateY(180deg);            }        }    </style></head><body>    <img src="./image/星空.jpg" alt=""></body></html>

rotateZ

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        * {            margin: 0;            padding: 0;        }                img {            /* 转换成块级元素*/            display: block;            margin: 200px auto;            /* 应用动画 */            animation: move 2s linear 0s infinite alternate;        }        /* 定义动画 */                @keyframes move {            0% {                transform: rotateZ(0deg);            }            100% {                transform: rotateZ(360deg);            }        }    </style></head><body>    <img src="./image/四.jpg" alt=""></body></html>

简写

  • transform: rotate3d(1, 1, 0, 180deg) -- 沿着对角线旋转 45deg
  • transform: rotate3d(1, 0, 0, 180deg) -- 沿着 x 轴旋转 45deg
 transform:rotate3d(x,y,z,deg)
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        * {            margin: 0;            padding: 0;        }                img {            display: block;            width: 600px;            margin: 200px auto;            transition: all 2s linear 0s;        }                img:hover {            transform: rotate3d(1, 1, 1, 180deg)        }    </style></head><body>    <img src="./image/星空.jpg" alt=""></body></html>

transform-style

transform:preserve-3d 让子元素放弃3d空间环境
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        * {            margin: 0;            padding: 0;        }                body {            perspective: 500px;        }                .box {            /* 开启定位 */            position: relative;            width: 400px;            height: 400px;            margin: 200px auto;            /* 父元素开启3d环境 */            transform-style: preserve-3d;            animation: clinopodium 2s linear 0s infinite alternate;        }        /*应用属性选择器设置款式 */                div[class^=son] {            position: absolute;            top: 0;            left: 0;            width: 100%;            height: 100%;            background-color: pink;        }        /* 设置子元素的第二个款式 */                .box div:nth-of-type(2) {            background-color: blue;            transform: rotateX(112deg);        }                .box div:nth-of-type(3) {            background-color: purple;            transform: rotateX(230deg);        }        /* 定义动画 */                @keyframes clinopodium {            0% {                transform: rotatex(0deg);            }            100% {                transform: rotateX(360deg);            }        }    </style></head><body>    <div class="box">        <div class="son1"></div>        <div class="son2"></div>        <div class="son3"></div>    </div></body></html>

案例

两面反转的盒子

思路

  • 先筹备一个大盒子 外面装着两个小盒子
  • 应用定义,让其中的一个盒子翻转180deg
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        body {            perspective: 400px;                    }                .box {            position: relative;            width: 400px;            height: 400px;            margin: 200px auto;            transition: all 0.4S;            /* 开启子元素在3d空间的环境 */            transform-style: preserve-3d;        }                .box:hover {            transform: rotateY(180deg);        }                .front,        .back {            position: absolute;            top: 0;            left: 0;            width: 100%;            height: 100%;            text-align: center;            line-height: 400px;            color: #cccccc;            font-weight: 700;            border-radius: 50%;        }                .front {            background-color: pink;            z-index: 1;        }                .back {            background-color: purple;            /* 像手机一样 背靠背 旋转 */            transform: rotateY(180deg);        }    </style></head><body>    <div class="box">        <div class="front">尧子陌</div>        <div class="back">临风笑却世间</div>    </div></body></html>

3d导航栏案例

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        /* 留神 视距写在li下面 */                * {            margin: 0;            padding: 0;        }                ul {            width: 600px;            margin: 100px auto;        }                li {            /* 设置定位 子绝父相 */            float: left;            width: 100px;            height: 35px;            list-style: none;            perspective: 500px;        }                .box {            position: relative;            top: 0;            left: 0;            width: 100%;            height: 100%;            /* 开启子元素的 3d成果 */            transform-style: preserve-3d;            /* 应用过渡成果 */            transition: all 0.4s linear 0s;        }        /* 鼠标通过box旋转90deg */                .box:hover {            transform: rotateX(90deg);        }                .front,        .bottom {            position: absolute;            top: 0;            left: 0;            width: 100%;            height: 100%;            text-align: center;            line-height: 35px;            color: cornsilk;            font-family: '楷体';        }                .front {            background-color: blue;            z-index: 1;            transform: translateZ(17.5px);        }                .bottom {            background-color: brown;            /* 先向下挪动17.5px 再沿X轴旋转90deg */            transform: translateY(17.5px) rotateX(-90deg);        }    </style></head><body>    <ul>        <li>            <div class="box">                <div class="front">hello</div>                <div class="bottom">尧子陌</div>            </div>        </li>        <li>            <div class="box">                <div class="front">hello</div>                <div class="bottom">尧子陌</div>            </div>        </li>    </ul></body></html>

旋转木马

  • 剖析如下:给body设置透视 给div的父元素设置3d成果
  • 把每个盒子摆放到正确的地位 利用动画即可
<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <meta name="viewport" content="width=device-width, initial-scale=1.0">    <title>Document</title>    <style>        * {            margin: 0;            padding: 0;        }                body {            /* 视距 */            perspective: 1000px;        }                section {            position: relative;            width: 200px;            height: 200px;            margin: 200px auto;            /* 让子元素显示3d属性 */            transform-style: preserve-3d;            /* 应用动画 */            animation: rotate 2s linear 0s infinite;        }                section:hover {            animation-play-state: paused;        }                @keyframes rotate {            0% {                transform: rotateY(0deg);            }            100% {                transform: rotateY(360deg);            }        }                section div {            position: absolute;            top: 0;            left: 0;            overflow: hidden;            width: 100%;            height: 100%;            border-radius: 50px;        }                section div:nth-of-type(1) {            transform: rotateY(0deg) translateZ(300px);        }                section div:nth-of-type(2) {            transform: rotateY(60deg) translateZ(300px);        }                section div:nth-of-type(3) {            transform: rotateY(120deg) translateZ(300px);        }                section div:nth-of-type(4) {            transform: rotateY(180deg) translateZ(300px);        }                section div:nth-of-type(5) {            transform: rotateY(240deg) translateZ(300px);        }                section div:nth-of-type(6) {            transform: rotateY(300deg) translateZ(300px);        }    </style></head><body>    <section>        <div><img src="./image/一.jpg" alt=""></div>        <div><img src="./image/二.jpg" alt=""></div>        <div><img src="./image/三.jpg" alt=""></div>        <div><img src="./image/四.jpg" alt=""></div>        <div><img src="./image/五.jpg" alt=""></div>        <div><img src="./image/六.jpg" alt=""></div>    </section></body></html>

浏览器公有前缀