css3 - 透视、旋转、曲线运动等3d动画

一、perspective (chrome、ie10+等)

用法:用在父元素上,透视效果

perspective:none | <length>

默认值:none

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>perspective</title>
    <style>
        .father {
            width: 200px;
            height: 200px;
            margin: 50px auto;
            border: 1px solid #000;
            -webkit-perspective: 110px;
            perspective: 110px;
        }
        .son {
            width: 180px;
            height: 120px;
            margin: 40px 10px;
            background-color: #ccc;
            -webkit-transform: rotatex(45deg);
            transform: rotatex(45deg);
        }
    </style>
</head>
<body>
    <div class="father">
        <div class="son"></div>
    </div>
</body>
</html>

例如:立方体就是利用perspective实现的。(transform值:"rotate"、"translate"的顺序会改变当前平面所在坐标轴,所以顺序不同,效果也不同)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <title>3d</title>
    <style>
        li {
            list-style-type: none;
        }
        .father {
            position: relative;
            margin: 100px 500px;
             -webkit-perspective: 1000px;
             perspective: 1000px;
        }
        .son  {
            position: absolute;
            top:0;
            left:0;
            width: 200px;
            height: 200px;
            line-height: 200px;
            margin: 40px 10px;
            border: 2px solid #C09;
            text-align: center;
            font-size: 100px;
        }
        .son:nth-child(1) {
            transform: translateZ(100px);
             -webkit-transform: translateZ(100px);
        }
        .son:nth-child(2) {
            transform: rotateY(90deg) translateZ(100px);
            -webkit-transform: rotateY(90deg) translateZ(100px);
        }
        .son:nth-child(3) {
            transform: rotateY(180deg) translateZ(100px);
            -webkit-transform: rotateY(180deg) translateZ(100px);
        }
        .son:nth-child(4) {
            transform: rotateY(-90deg) translateZ(100px);
            -webkit-transform: rotateY(-90deg) translateZ(100px);
        }
        .son:nth-child(5) {
            transform: rotateX(90deg) translateZ(100px);
            -webkit-transform: rotateX(90deg) translateZ(100px);
        }
        .son:nth-child(6) {
            transform: rotateX(-90deg) translateZ(100px);
            -webkit-transform: rotateX(-90deg) translateZ(100px);
        }
    </style>
</head>
<body>
<ul class="father">
    <li class="son">1</li>
    <li class="son">2</li>
    <li class="son">3</li>
    <li class="son">4</li>
    <li class="son">5</li>
    <li class="son">6</li>
</ul>
</body>
</html>

二、perspective-origin (chrome、ie10+等)

用法:用在父元素上,指定透视点的位置。

perspective-origin:[ <percentage> | <length> | left | center① | right ] [ <percentage> | <length> | top | center② | bottom ]

上面的father代码修改:

.father {
    position: relative;
    margin: 100px 500px;
    -webkit-perspective: 1000px;
    perspective: 1000px;
    -webkit-perspective-origin: 90% bottom;
    perspective-origin: 90% bottom;
}

效果明显与上图视角变化了

三、transform-style (chrome等、不支持ie)

用法:用在父元素上,指定子元素变换时(比如立方体旋转动起来时)始终位于三维空间内。

transform-style:flat | preserve-3d

默认值:flat

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
    <title>preserve-3d</title>
    <style>
        li {
            list-style-type: none;
        }
        .father-wrap {
            position: relative;
            -webkit-perspective: 1000px;
            perspective: 1000px;
        }
        .father {
            position: absolute;
            top: 50%;
            left: 50%;
            width: 200px;
            height: 200px;
            transform-style: preserve-3d;
            -webkit-transform-style: preserve-3d;
            animation: rotaY 5s infinite linear;
            -webkit-animation: rotaY 5s infinite linear;
        }
        .son  {
            position: absolute;
            top:0;
            left:0;
            width: 200px;
            height: 200px;
            line-height: 200px;
            margin: 40px 10px;
            border: 2px solid #C09;
            text-align: center;
            font-size: 100px;
        }
        .son:nth-child(1) {
            transform: translateZ(100px);
             -webkit-transform: translateZ(100px);
        }
        .son:nth-child(2) {
            transform: rotateY(90deg) translateZ(100px);
            -webkit-transform: rotateY(90deg) translateZ(100px);
        }
        .son:nth-child(3) {
            transform: rotateY(180deg) translateZ(100px);
            -webkit-transform: rotateY(180deg) translateZ(100px);
        }
        .son:nth-child(4) {
            transform: rotateY(-90deg) translateZ(100px);
            -webkit-transform: rotateY(-90deg) translateZ(100px);
        }
        .son:nth-child(5) {
            transform: rotateX(90deg) translateZ(100px);
            -webkit-transform: rotateX(90deg) translateZ(100px);
        }
        .son:nth-child(6) {
            transform: rotateX(-90deg) translateZ(100px);
            -webkit-transform: rotateX(-90deg) translateZ(100px);
        }
        @keyframes  rotaY{
            0% {
                -webkit-transform: rotateY(0deg);
            }
            100% {
                -webkit-transform: rotateY(-360deg);
            }
        }
        @-webkit-keyframes  rotaY{
            0% {
                -webkit-transform: rotateY(0deg);
            }
            100% {
                -webkit-transform: rotateY(-360deg);
            }
        }
    </style>
</head>
<body>
<div class="father-wrap">
    <ul class="father">
        <li class="son">1</li>
        <li class="son">2</li>
        <li class="son">3</li>
        <li class="son">4</li>
        <li class="son">5</li>
        <li class="son">6</li>
    </ul>
</div>
</body>
</html>

鼠标移动到立方体上时:

.father {
    position: absolute;
    top: 50%;
    left: 50%;
    width: 200px;
    height: 200px;
    transform-style: preserve-3d;
    -webkit-transform-style: preserve-3d;
    transition: transform 2s;
    -webkit-transition: transform 2s;
    /*animation: rotaY 5s infinite linear;
    -webkit-animation: rotaY 5s infinite linear;*/

}
.father:hover {
    transform: rotateX(360deg) rotateY(360deg);
    -webkit-transform: rotateX(360deg) rotateY(360deg);
}

通过上面的例子,perspective 和 transform-style: preserve-3d 明显的区别是前者是静态的立体效果,后者是动态始终维持的立体效果

四、transform-origin (chrome、ie10+等)

用法:用在转换元素上,指定当前元素转换的原点。例如物体曲线运动时的原点(圆心)等等。

transform-origin:[ <percentage> | <length> | left | center① | right ] [ <percentage> | <length> | top | center② | bottom ]

默认值:50% 50%,效果等同于center center

例如:下面的曲线上的小图标沿曲线旋转运动,一部分代码如下,关键是transform-origin的运用

<div class="ring-box">
    <img class="ring-item ring-item0" src="login/flag.png" alt=""/>
    <div class="ring-item ring-item1">
        <img src="login/ring-05.png" alt=""/>
        <img src="login/ring-06.png" alt=""/>
    </div>
    <div class="ring-item ring-item2">
        <img src="login/ring-01.png" alt=""/>
        <img src="login/ring-02.png" alt=""/>
    </div>
    <div class="ring-item ring-item3">
        <img src="login/ring-03.png" alt=""/>
        <img src="login/ring-04.png" alt=""/>
    </div>
    <div class="ring-item ring-item4">
        <!--<img src="login/ring-arrow-left.png" alt=""/>-->
        <img src="login/ring-arrow.png" alt=""/>
    </div>
</div>
.ring-box .ring-item1 img:nth-of-type(1) {
   position: absolute;
   top: 255px;
   left: 560px;
   transform-origin: -290px 94px 0;
   -webkit-transform-origin: -290px 94px 0;
   animation:rotate-120 5s  linear infinite;
   -webkit-animation:rotate-120 5s  linear infinite; /* Safari 和 Chrome */
}

@-webkit-keyframes rotate-120{
   0% {transform: rotate(0deg);-webkit-transform: rotate(0deg);opacity:1;}
   100% {transform: rotate(-120deg) ;-webkit-transform: rotate(-120deg);opacity:0;}
}
@keyframes rotate-120{
   0% {transform: rotate(0deg) ;-webkit-transform: rotate(0deg);opacity:1;}
   100% {transform: rotate(-120deg) ;-webkit-transform: rotate(-120deg);opacity:0;}
}

效果:

五、backface-visibility (chrome、ie10+等)

用法:用在转换元素上,指定元素背面面向用户时是否可见。

backface-visibility:visible | hidden

默认值:visible

例如:在步骤三的旋转立方体代码中修改son,添加backface-visibility

.son  {
    position: absolute;
    top:0;
    left:0;
    width: 200px;
    height: 200px;
    line-height: 200px;
    margin: 40px 10px;
    border: 2px solid #C09;
    text-align: center;
    font-size: 100px;
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
}

效果:

猜你喜欢

转载自my.oschina.net/u/3019884/blog/1539418