用CSS3畫出一個立方體---轉


css3實踐—創建3D立方體

  要想實現3D的效果,其實非常簡單,只需指定一個元素為容器並設置transform-style:preserve-3d,那么它的后代元素便會有3D效果。不過有很多需要注意的地方,這里把我學習的方法,過程分享給大家。再講知識點之前,還是先弄清楚3D的坐標系吧,從網上搜了一張經典坐標系圖,供大家回顧一下。

1、3D試圖

  transform-style:flat(默認,二維效果) / preserve-3d(三維效果)。設置一個元素的transform-style:preserve-3d;只影響這個元素的子元素(如果孫元素也有3d效果,那么還必須給子元素設置preserve-3d)。這樣所有子元素都可以相對與父元素的平面進行3d變形操作。和二維變形一樣,三維變形可以使用transform屬性來設置。可以通過制定的函數或者通過三維矩陣來對元素變型。列舉幾個函數:

  translate3d(x,y,z) 使元素在這三個緯度中移動,也可以分開寫,如:translateX(length),translateY(length), translateZ(length)。注意z軸的值只能為px;

  scale3d(number,number,number) 使元素在這三個緯度中縮放,也可分開寫,如:scaleX(),scaleY(),scaleY()。

  rotateX(angle) 是元素依照x軸旋轉;

  rotateY(angle) 是元素依照y軸旋轉;

  rotateZ(angle) 是元素依照z軸旋轉。

2、透視/景深效果

  perspective(length) 為一個元素設置三維透視的距離。僅作用於元素的后代,而不是其元素本身。當perspective:none/0;時,相當於沒有設perspective(length)。比如你要建立一個小立方體,長寬高都是200px。如果你的perspective < 200px ,那就相當於站在盒子里面看的結果,如果perspective 非常大那就是站在非常遠的地方看(立方體已經成了小正方形了)。

  當元素沒有設置perspective(length)時,所有后代元素被壓縮在同一個二維平面上,不存在景深的效果。如果設置perspective(length)后,將會看到三維的效果。默認的透視視角中心在容器(是perspective所在的元素,不是他的后代元素)的中點,也就是perspective-origin: 50% 50%。當然你也可以自己設置,比如:左上角-webkit-perspective-origin: 0px 0px;。

  綜合以上兩點,我們可以通過幾個實例,來深入了解下perspective(length);  和  transform-style:preserve-3d;

   (1)當設置perspective(length);不設置transform-style:preserve-3d;當元素靜止時,會有立體的效果:

   (2)當設置perspective(length);不設置transform-style:preserve-3d;當元素旋轉時的效果:

      

   (3)當設置transform-style:preserve-3d;不設置perspective(length);當元素靜止時,不會有立體的效果。

   (4)當設置perspective(length);不設置transform-style:preserve-3d;當元素旋轉時的效果:

   (5)只有當兩個值都設置,不管是靜止還是旋轉,都會看到立體的效果。

注意:(1)如果一個元素以x軸或y軸旋轉90度以上的話,那么它的背面將面向用戶。背面的元素始終是透明的,所以用戶通過后面看到正面的反向形態,就像是從在玻璃門后面看對外張貼的標志。為了防止顯示鏡像的前面。可以將backface-visibility設置為hidden;如果backface-visibility:hidden;那么這個元素就不會在背面可見了。這么做的一個原因就是,想一個元素有兩個面,就像一個撲克牌。比如:創建一張撲克牌,正面和背面一定不一樣,這兩個面的位置是背靠背的。這兩個元素一起轉動,正面逐步向后反轉隱藏,同時背面向前反轉並出現。如果背面的元素是可見的,旋轉時它將掩蓋它底下的元素,而不是露出它下面的元素。

   (2)如果父元素設置overflow:hidden;那么子元素就無法跳出父元素的平面,也就不能出現3D效果。就如同,transform-style:flat;

最后,把我寫的小例子分享給大家(此例子僅是基於-webkit-內核,如不能觀看效果,建議換成chrome瀏覽器)。

復制代碼
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>3D立方體</title>
<meta name="Keywords" content="">
<meta name="Description" content="">
<meta name="author" content="@my_programmer">
<style type="text/css">
/*重置{*/
* { padding: 0; margin: 0; }img{border:0;}li{list-style:none;}
/*}重置*/
ul{width:200px;height:200px;margin:100px auto;position:relative;-webkit-transform-style:preserve-3d;}    
    /*如果在ul里設置:-webkit-perspective:400px;-webkit-perspective-origin:0% 50%; 則會有透視、景深的效果*/
li{width:200px;height:200px;position:absolute;text-align:center;line-height:200px;font-size:80px;font-weight:bold;color:#fff;}
li:nth-child(1){background:rgba(255,0,0,1);-webkit-transform:rotateX(90deg)   translateZ(100px);}
li:nth-child(2){background:rgba(0,255,255,1);-webkit-transform:rotateX(270deg)  translateZ(100px);}
li:nth-child(3){background:rgba(255,0,255,1);-webkit-transform:rotateY(90deg) translateZ(100px);}
li:nth-child(4){background:rgba(0,255,0,1);-webkit-transform:rotateY(270deg) translateZ(100px);}
li:nth-child(5){background:rgba(200,200,0,1);-webkit-transform:translateZ(-100px);}
li:nth-child(6){background:rgba(0,0,255,1);-webkit-transform: translateZ(100px) ;}
.button{width:200px;margin:20px auto;position:relative;}
input{width:50px;height:30px;position:absolute;cursor:pointer;}
input:nth-child(1){left:100px;top:0;}
input:nth-child(2){left:200px;top:50px;}
input:nth-child(3){left:0px;top:50px;}
input:nth-child(4){left:100px;top:100px;}
input:nth-child(5){left:100px;top:50px;}
        /*****當執行下列css時,立方體無限自由旋轉******/
/* ul{-webkit-animation:run 5s linear infinite ;}    
@-webkit-keyframes run{
    0%{-webkit-transform: rotateX(0deg) rotateY(0deg) }
    100%{-webkit-transform:rotateX(360deg)  rotateY(360deg)  }
}
*/
</style>
</head>
<body>
    <ul id="ul">
        <li>1</li>
        <li>2</li>
        <li>3</li>
        <li>4</li>
        <li>5</li>
        <li>6</li>
    </ul>
    <div class="button">
        <input type="button" value="上">
        <input type="button" value="右">
        <input type="button" value="左">
        <input type="button" value="下">
        <input type="button" value="重置">
    </div>
<script type="text/javascript">
<!--
    var ul=document.getElementById('ul');
    var inputs=document.getElementsByTagName('input');
    var x=0,y=0;
    /////////////////////////鼠標控制
    for(var i=0;i<inputs.length;i++){
        inputs[i].onclick=run;
    }
    function run(){
        ul.style.webkitTransition='-webkit-transform 3s linear';  //設置立方體變換的屬性、持續時間、動畫類型
        if(inputs[0]==this){x+=90;}
        if(inputs[1]==this){y+=90;}
        if(inputs[2]==this){y-=90;}
        if(inputs[3]==this){x-=90;}
        if(inputs[4]==this){x=0;y=0; ul.style.webkitTransition='-webkit-transform 0.1s linear';}    //當點擊重置按鈕時,迅速轉回到初始狀態。
        ul.style.webkitTransform = "rotateX("+x+"deg) rotateY("+y+"deg)";    //變換效果(沿X軸和Y軸旋轉)
    }    
    ////////////////////////鍵盤控制    
    document.addEventListener('keydown', function(e){
        ul.style.webkitTransition='-webkit-transform 3s linear';
        switch(e.keyCode){
            case 37:    y -= 90;    //左箭頭
                        break;
            case 38:    x += 90;    //上箭頭
                        break;
            case 39:    y += 90;    //下箭頭
                        break;
            case 40:    x -= 90;    //右箭頭
                        break;
            case 13:    x=0; y=0;    //回車 (當回車時,迅速轉回初始狀態)
                        ul.style.webkitTransition='-webkit-transform 0.1s linear';
                        break;
        }
        ul.style.webkitTransform = "rotateX("+x+"deg) rotateY("+y+"deg)"; //變換效果(沿X軸和Y軸旋轉)
    }, false);
//-->
</script>
</body>
</html>


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM