1. 程式人生 > >CSS3 3D旋轉立方

CSS3 3D旋轉立方

一、3D中的透視

       1、透視是我們觀察事物的方式
       在美術學中,有一種畫法叫做透視畫法,他讓我們對所觀察的物體從二維拓展到三維,也就是說,平面的物體變成了立體,佔據了獨自的空間。請看下圖:
這裡寫圖片描述
這裡寫圖片描述
       2、從二維到三維
       在CSS3中有一個屬效能讓我們以透視的方式去觀察元素,他就是perspective,(注意perspective是用在透視元素的父元素上,也就是說一個元素具有perspective屬性,其子元素就會獲得透視效果),那麼擁有透視效果的元素和沒有透視效果的元素之間有什麼區別呢,請往下看:

  • 沒有透視效果的子元素
CSS
程式碼 .wrap{ width:200px; height:200px; background-color:#f00; } .box{ transform:rotateY(90deg); width:100px; height:100px; background-color:#f0f; }
HTML程式碼
<div class="wrap">
    <div class="box"></div>
</div>

這裡寫圖片描述

  • 具有透視效果的子元素
    在父元素(類名為wrap的元素)加上perspective:800px;
CSS程式碼
.wrap{
    perspective:600px;
    width:200px;
    height:200px;
    background-color:#f00;
}
.box{
    transform:rotateY(90deg);
    width:100px;
    height:100px;
    background-color:#f0f;
}
HTML程式碼
<div class="wrap">
    <div class="box"></div>
</div>

這裡寫圖片描述

二、如何佈局立方體

       1、理解perspective
       當元素獲得透視效果的時候,我們觀察他的透視點位於瀏覽器的前方,而perspective後面的單位決定了透視點在Z軸上的位置,為了方便理解,我們可以看下圖:
這裡寫圖片描述


       2、佈局立方體
       大家都知道立方體有六個面,所以我們就需要六個div元素來表示這六個面,但是div是塊級元素,會換行顯示,所以我們就需要絕對定位讓這六個div元素重合在一起,
這裡寫圖片描述
接下來就是讓這六個div分別表示立方的的六個面了,或許到這裡你會有疑問,應該怎麼辦才能達到我們想要的效果呢?不急,我們可以慢慢來–從立方體中間的切面出發。
       假設一個邊長為20cm的立方體,我們從中間一刀切下去,獲得他的切面如下:
這裡寫圖片描述
獲得了切面之後,要想表示立方體的六個面就很容易了,不知道大家發現了沒有,對於正面,可以讓切面向前移動10cm(邊長的一半)獲得,對於背面,可以讓切面繞Y軸旋轉180度之後再向前移動10cm獲得,以此類推,左面,右面,上面和下面分別讓切面繞Y旋轉-90度,繞Y軸旋轉90度,繞X軸旋轉90度,繞X軸旋轉-90度之後,在向前移動10cm。(為什麼都是向前移動呢?因為元素在旋轉之後他的Z軸方向也發生了變化。)
       3、萬事俱備,只欠東風
       上面我們已經佈局好了立方體,接下來就是讓他繞中軸旋轉起來了。其實出發點還是和上面的一樣,只要讓中間的切面旋轉,立方體也就自然而然的旋轉起來了。

三、程式碼部分和demo演示

CSS程式碼
        body{
            margin: 0;
        }
        #stage{
            perspective:800px;
            perspective-origin:50% 50%;
            -webkit-perspective:800px;
            -webkit-perspective-origin:50% 50%;
        }
        #stage .cubic{
            position:relative;
            transform-style:preserve-3d;
            width:206px;
            height:206px;
            margin:200px auto 0;
            animation:myfirst 18s linear infinite paused;
        }
        #stage .cubic:hover{
            animation-play-state:running;
        }
        #stage .cubic div{
            position:absolute;
            opacity:.6;
            width:200px;
            height:200px;
            background-color:#14346f;
            border:3px solid #1883e7;
        }
        .front{
            transform:translateZ(100px);
        }
        .behind{
            transform:rotateY(180deg) translateZ(100px);
        }
        .left{
            transform:rotateY(90deg) translateZ(100px);
        }
        .right{
            transform:rotateY(-90deg) translateZ(100px);
        }
        .upper{
            transform:rotateX(90deg) translateZ(100px);
        }
        .lower{
            transform:rotateX(-90deg) translateZ(100px);
        }
        @keyframes myfirst{
            from{transform:rotateY(0deg);}
            to{transform:rotateY(360deg);}
        }
HTML程式碼
    <div id="stage">
        <div class="cubic">
            <div class="front"></div>
            <div class="behind"></div>
            <div class="left"></div>
            <div class="right"></div>
            <div class="upper"></div>
            <div class="lower"></div>
        </div>
    </div>