css-3D转换

3D位移

写法1:

transform: translate3d(x, y, z);
translate3d(x, y, z) 中的 x, y, z 分别代表 x轴, y轴, z轴 正方向位移量。x,y,z不可以省略,没有的话写0

默认情况下:
x轴正方向 》向右,
y轴正方向 》向下,
z轴正方向 》从电脑屏幕向眼睛方向,向外

向Z轴正方向移动,靠近眼镜,视觉效果物体变大,
向Z轴负方向移动,远离眼镜,视觉效果物体变小,

正值代表向正方向移动,复制代表向负方向移动
transform: translate3d(x, y, z);是简写方式,也可以这样写:

写法2:

transform: translateX(X) translateY(Y) translateZ(Z);每个中间空格隔开,或者每个单独写:

写法3:

transform: translateX();
transform: translateY();
transform: translateZ();

注意:translateX() translateY() 里面可以写像素PX、百分比,百分比是根据自身的宽高的百分比,常使用百分比位移来使盒子水平垂直居中,但是translateZ()里面单位只能是像素PX

3D旋转

transform: rotateX(deg);- - -根据X轴旋转
transform: rotateY(deg);- - -根据y轴旋转
transform: rotateZ(deg);- - -根据z轴旋转

transform: rotate3d(x, y, z,deg);- - -根据自由轴旋转,x,y,z不可以省略,deg代表旋转度数

透视和3D呈现

3D效果的呈现不仅要书写以上的3d位移和旋转属性,要加上透视和3D呈现属性才能生效

透视:perspective: *px; - - - 单位是px,加在要观察的元素的父级及以上盒子上,加多少像素可以自己调试

3D呈现:transform-style: preserve-3d; - - - 加在父盒子上,这样里面的子盒子也有3D效果

示例

示例1:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>两面翻盒子</title>
    <style>
        body {
            perspective: 400px;
        }
        
        .box {
            position: relative;
            width: 200px;
            height: 200px;
            margin: 100px auto;
            transition: all 2s;
            /* 给父级添加,让子盒子保留立体空间 */
            transform-style: preserve-3d;
        }
        
        .box:hover {
            transform: rotateY(180deg)
        }
        
        .box div {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            text-align: center;
            line-height: 200px;
            border-radius: 50%;
        }
        
        .box div:nth-child(1) {
            background-color: pink;
            z-index: 1;
        }
        
        .box div:nth-child(2) {
            background-color: green;
            transform: rotateY(180deg);
        }
    </style>
</head>

<body>
    <div class="box">
        <div>吃苹果?</div>
        <div>吃榴莲?</div>
    </div>
</body>

</html>

原理:
两个子盒子定位到父盒子里面同样位置,将第二个盒子进行围绕Y轴180度的旋转,和第一个盒子背靠背,第一个盒子的层级设为1,压住第二个盒子显示,鼠标移动到父盒子上时,整个父盒子围绕Y轴旋转

页面效果:
两面翻盒子.gif

示例2:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>3D导航栏</title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        
        ul {
            margin: 100px;
        }
        
        ul li {
            float: left;
            list-style: none;
            width: 100px;
            height: 35px;
            margin: 0 5px;
            perspective: 500px;
        }
        
        .box {
            position: relative;
            width: 100%;
            height: 100%;
            transform-style: preserve-3d;
            transition: all 1s;
        }
        
        .box:hover {
            transform: rotateX(90deg);
        }
        
        .box div {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            line-height: 35px;
            text-align: center;
        }
        
        .box div:nth-child(1) {
            transform: translateZ(17.5px);
            z-index: 1;
            background-color: pink;
        }
        
        .box div:nth-child(2) {
            transform: translateY(17.5px) rotateX(-90deg);
            background-color: green;
        }
    </style>
</head>

<body>
    <ul>
        <li>
            <div class="box">
                <div></div>
                <div></div>
            </div>
        </li>
        <li>
            <div class="box">
                <div></div>
                <div></div>
            </div>
        </li>
        <li>
            <div class="box">
                <div></div>
                <div></div>
            </div>
        </li>
        <li>
            <div class="box">
                <div></div>
                <div></div>
            </div>
        </li>
    </ul>
</body>

</html>

原理:
第二个盒子向Y轴正方向向下移动盒子一半的距离,然后围绕X轴向外翻转90度,使字朝下,第一个盒子向Z轴正方向移动,向外移动盒子一半的距离,这样父盒子围绕X轴旋转的中心线及时两个子盒子组成的盒子空间中心轴,然后设置鼠标移动到父盒子上时围绕X轴旋转

页面效果:
3D导航.gif

示例3:

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>旋转木马案例</title>
    <style>
        body {
            perspective: 1200px;
        }
        
        section {
            position: relative;
            width: 300px;
            height: 300px;
            margin: 200px auto;
            transform-style: preserve-3d;
            /* 使用动画 */
            animation: move 30s linear infinite;
        }
        /* 定义动画 */
        
        @keyframes move {
            0% {}
            100% {
                transform: rotateY(360deg)
            }
        }
        
        section:hover {
            animation-play-state: paused;
        }
        
        section div {
            position: absolute;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: url(images/dog.jpg) no-repeat;
        }
        
        section div:nth-child(1) {
            transform: translateZ(300px);
        }
        
        section div:nth-child(2) {
            transform: rotateY(60deg) translateZ(300px);
        }
        
        section div:nth-child(3) {
            transform: rotateY(120deg) translateZ(300px);
        }
        
        section div:nth-child(4) {
            transform: rotateY(180deg) translateZ(300px);
        }
        
        section div:nth-child(5) {
            transform: rotateY(240deg) translateZ(300px);
        }
        
        section div:nth-child(6) {
            transform: rotateY(300deg) translateZ(300px);
        }
        
        section div:nth-child(7) {
            width: 100%;
            height: 100%;
            background: url(images/cat1.jpg) no-repeat;
        }
    </style>
</head>

<body>
    <section>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
        <div></div>
    </section>

</body>

</html>

原理:
外层的6个图片,第一个向Z轴正方向向外移动一段距离,从第二个图片开始到户外层最后一个图片,都先围绕Y轴旋转一定度数,然后向Z轴正方向移动一段距离,外层图片向Z轴移动距离一致,围绕Y轴旋转的度数是360度 除以 图片的张数,我这里是6张图,所以依次旋转 60° 120° 180° 240° 300°
然后里面我也放了一张图,这张图不用做处理,
给父盒子设置动画,进行360的循环旋转,鼠标移动到父盒子上时停止旋转,鼠标移开后又继续旋转

页面效果:
旋转木马3.gif

旋转时度数的正负判断

使用左手法则,大拇指和其余4指呈直角状态,4手指向手掌心方向弯曲,手背朝向自己的脸部,大拇指指向要围绕旋转的轴的正方向,
如果旋转方向时跟4手指弯曲的方向一致,则是正值;反方向,则是负值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值