首頁  >  文章  >  web前端  >  分享CSS3的perspective屬性設定3D變換距離的範例方法

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

高洛峰
高洛峰原創
2017-03-10 09:49:002110瀏覽

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"    style="max-width:90%" />
    <img src="images/cardKingClub.png" alt="" width="142"    style="max-width:90%" />
</p>
<p>
    <img src="images/cardKingClub.png" alt="" width="142"    style="max-width:90%" />
    <img src="images/cardKingClub.png" alt="" width="142"    style="max-width:90%" />
</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;   
}

#其效果如下:
分享CSS3的perspective屬性設定3D變換距離的範例方法

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

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

perspective:none | <length>

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

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

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;   
}

效果如下圖所示:
分享CSS3的perspective屬性設定3D變換距離的範例方法

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

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

上圖顯示了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"    style="max-width:90%" />
    </p>
</p>
<p class="stage">
    <p class="container">
        <img src="images/cardKingClub.png" alt="" width="142"    style="max-width:90%" />
    </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);   
}

效果如下所示:
分享CSS3的perspective屬性設定3D變換距離的範例方法

上图效果可以看出,虽然书写的形式,属性名称不一致,但是效果却一样。

虽然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属性结合起来使用,以便将视点移至元素的中心以外位置,如下图所示:
分享CSS3的perspective屬性設定3D變換距離的範例方法

往往我们看一样东西不可能一直都在中心位置看,想换个角度,换个位置一看究竟,这个时候就离不开perspective-origin这个属性,下面来自于W3C官网的图可以简单阐述这一观点:
分享CSS3的perspective屬性設定3D變換距離的範例方法

以上是分享CSS3的perspective屬性設定3D變換距離的範例方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn