分享CSS3的perspective屬性設定3D變換距離的樣本方法

來源:互聯網
上載者:User
perspective屬性及相關的perspective-origin屬性都是用來控制3D圖形空間中座標軸上的距離的,下面我們就來分享CSS3的perspective屬性設定3D變換距離的樣本方法,當然後面也會講到perspective-origin的用法:

perspective屬性對於3D變形來說至關重要。該屬性會設定查看者的位置,並將可視內容映射到一個視錐上,繼而投到一個2D視平面上。如果不指定透視,則Z軸空間中的所有點將平鋪到同一個2D視平面中,並且變換結果中將不存在景深概念。

上面的描述可能讓人難以理解一些,其實對於perspective屬性,我們可以簡單的理解為視距,用來設定使用者和元素3D空間Z平面之間的距離。而其效應由他的值來決定,值越小,使用者與3D空間Z平面距離越近,視覺效果更令人印象深刻;反之,值越大,使用者與3D空間Z平面距離越遠,視覺效果就很小。

在3D變形中,對於某些變形,例如下面的樣本示範的沿Z軸的變形,perspective屬性對於查看變形的效果來說必不可少。

我們先來看一個簡單的執行個體,製作一個撲克牌3D旋轉效果,並且一個在撲克牌的父元素添加了視距perspective,而另一個卻沒有設定:

HTML

<p>    <img src="images/cardKingClub.png" alt="" width="142" height="200" />    <img src="images/cardKingClub.png" alt="" width="142" height="200" /></p><p>    <img src="images/cardKingClub.png" alt="" width="142" height="200" />    <img src="images/cardKingClub.png" alt="" width="142" height="200" /></p>

CSS

p {       width: 500px;       height: 300px;       margin: 30px auto;       position: relative;       background: url(images/bg-grid.jpg) no-repeat center center;       background-size: 100% 100%;   }   p img {       position: absolute;       top: 50%;       left: 50%;       margin-left: -71px;       margin-top: -100px;        transform-origin: bottombottom;   }   p img:nth-child(1){       opacity: .5;       z-index: 1;   }   p img:nth-child(2){       z-index: 2;       transform: rotateX(45deg);   }   p:nth-of-type(2){       perspective: 500px;   }

其效果如下:

的效果完全說明了一切。父節點沒有設定perspective的情況下,梅花King的3D旋轉效果不明顯,而在父節點設定perspective後,梅花King才像個3D旋轉。

上例簡單的示範了perspective的使用方法,我們回過頭來,看看perspective的使用文法:

perspective:none | <length>

perspective屬性包括兩個屬性:none和具有單位的長度值。其中perspective屬性的預設值為none,表示無限的角度來看3D物體,但看上去是平的。另一個值<length>接受一個長度單位大於0的值。而且其單位不能為百分比值。<length>值越大,角度出現的越遠,從而建立一個相當低的強度和非常小的3D空間變化。反之,此值越小,角度出現的越近,從而建立一個高強度的角度和一個大型3D變化。

比如你站在10英尺和1000英尺的地方看一個10英尺的立方體。在10英尺的地方,你距離立方體是一樣的尺寸。因此視角轉變遠遠大於站在1000英尺處的,立體尺寸是你距離立方體距離的百分之一。同樣的思維適用於perspective的<length>值。我們一起來看一個執行個體,來加強這方面的理解:

HTML

<p class="wrapper w2">    <p class="cube">        <p class="side  front">1</p>        <p class="side   back">6</p>        <p class="side  right">4</p>        <p class="side   left">3</p>        <p class="side    top">5</p>        <p class="side bottom">2</p>    </p></p><p class="wrapper w1">    <p class="cube">        <p class="side  front">1</p>        <p class="side   back">6</p>        <p class="side  right">4</p>        <p class="side   left">3</p>        <p class="side    top">5</p>        <p class="side bottom">2</p>    </p></p>

CSS

.wrapper {       width: 50%;       float: left;   }   .cube {       font-size: 4em;       width: 2em;       margin: 1.5em auto;       transform-style: preserve-3d;       transform: rotateX(-40deg) rotateY(32deg);   }   .side {       position: absolute;       width: 2em;       height: 2em;       background: rgba(255, 99, 71, 0.6);       border: 1px solid rgba(0, 0, 0, 0.5);       color: white;       text-align: center;       line-height: 2em;   }   .front {       transform: translateZ(1em);   }   .top {       transform: rotateX(90deg) translateZ(1em);   }   .rightright {       transform: rotateY(90deg) translateZ(1em);   }   .left {       transform: rotateY(-90deg) translateZ(1em);   }   .bottombottom {       transform: rotateX(-90deg) translateZ(1em);   }   .back {       transform: rotateY(-180deg) translateZ(1em);   }   .w1 {       perspective: 100px;   }   .w2{       perspective: 1000px;   }

效果如所示:

依據上面的介紹,我們可對perspective取值做一個簡單的結論:

1.perspective取值為none或不設定,就沒有真3D空間。
2.perspective取值越小,3D效果就越明顯,也就是你的眼睛越靠近真3D。
3.perspective的值無窮大,或值為0時與取值為none效果一樣。
為了更好的理解perspective屬性,我們很有必要把他和translateZ的關係結合起來。其實也可以把perspective的值簡單的理解為人的眼睛到顯示器的距離,而translate就是3D物體距離源點的距離,下面引用W3C的一張圖來解說perspective和translateZ的關係。

顯示了perspective屬性和translateZ的位置比例。要頂部的圖,Z是半個d,為了使用原始圓(輪廓)看起來出現在Z軸上(虛線圓),畫布上的實體圓將擴大兩部,如淺藍色的圓。在底部圖中顯示,圓按比例縮小,致使虛線圓出現在畫布後面,並且z的大小是距原始位置三分之一。

在3D變形中,除了perspective屬性可以啟用一個3D空間之外,在3D變形的函數中的perspective()也可以啟用3D空間。他們不同的地方是:perspective用在舞台元素上(變形元素們的共同父元素);perspective()就是用在當前變形元素上,並且可以與其他的transform函數一起使用。例如,我們可以把:

.stage {       perspective: 600px}

寫成:

.stage .box {       transform: perspective(600px);   }

來看一個簡單樣本:

HTML

<p class="stage">    <p class="container">        <img src="images/cardKingClub.png" alt="" width="142" height="200" />    </p></p><p class="stage">    <p class="container">        <img src="images/cardKingClub.png" alt="" width="142" height="200" />    </p></p>

CSS

.stage {       width: 500px;       height: 300px;       margin: 30px auto;       position: relative;       background: url(images/bg-grid.jpg) no-repeat center center;       background-size: 100% 100%;   }   .container {       position: absolute;       top: 50%;       left: 50%;       width: 142px;       height: 200px;       border: 1px dotted orange;       margin-left: -71px;       margin-top: -100px;    }   .container img{       transform: rotateY(45deg);   }   .stage:nth-child(1) .container{       perspective: 600px;   }   .stage:nth-child(2) img {       transform:perspective(600px) rotateY(45deg);   }

效果如下所示:

效果可以看出,雖然書寫的形式,屬性名稱不一致,但是效果卻一樣。

雖然perspective屬性和perspective()函數所起的功能是一樣的,但其取值以及以運用的對像有所不同:

1. perspective屬性可以取值為none或長度值;而perspective()函數取值只能大於0,如果取值為0或比0小的值,將無法啟用3D空間;
2.perspective屬性用於變形對像父元素;而perspective()函數用於變形對像自身,並和transform其他函數一起使用。

perspective-origin屬性

perspective-origin屬性是3D變形中另一個重要屬性,主要用來決定perspective屬性的源點角度。它實際上設定了X軸和Y軸位置,在該位置觀看者好像在觀看該元素的子項目。

perspective-origin屬性的使用文法也很簡單:

代碼如下:

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


該屬性的預設值為“50% 50%”(也就是center),其也可以設定為一個值,也可以設定為兩個長度值:

第一個長度值指定相對於元素的包含框的X軸上的位置。它可以是長度值(以受支援的長度單位表示)、百分比或以下三個關鍵詞之一:left(表示在包含框的X軸方向長度的0%),center(表示中間點),或right(表示長度的100%)。
第二個長度值指定相對於元素的包含框的Y軸上的位置。它可以是長度值、百分比或以下三個關鍵詞之一:top(表示在包含框的Y軸方向長度的0%),center(表示中間點),或bottom(表示長度的100%)。
注意,為了指轉換子項目變形的深度,perspective-origin屬性必須定義父元素上。通常perspective-origin屬性本身不做任何事情,它必須被定義在設定了perspective屬性的元素上。換句話說,perspective-origin屬性需要與perspective屬性結合起來使用,以便將視點移至元素的中心以外位置,如所示:

往往我們看一樣東西不可能一直都在中心位置看,想換個角度,換個位置一看究竟,這個時候就離不開perspective-origin這個屬性,下面來自於W3C官網的圖可以簡單闡述這一觀點:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.