1. 程式人生 > >元素轉換-Transform

元素轉換-Transform

file content 空格 opera library ota 通過 form tex

所謂元素轉換,事實上就是對元素的坐標在二維或三維空間上做矩陣換算。依據換算的結果,又分成了多種轉換類型。但不管是哪一種。都不影響元素在頁面上的物理空間。僅僅改變元素的視覺效果。

也就是說,比方元素縮放、旋轉都不影響周圍其它元素的布局。有些人喜歡用平移做元素居中效果,事實上非常不妥,由於元素原來的物理空間還在那裏,控制起來不輕松。

另外。轉換屬性(transform)僅僅有一個。也就是說,假設之前做了旋轉(rotate)。假設再做平移(translate),旋轉效果就會消失。

假設既想平移,又想旋轉,必須使用matrix或matrix3d方法。但也不是不能疊加,僅僅是多個效果需用空格分開,比方:transform:rotateY(90deg) translateZ(50px);

不管是二維還是三維。記住。全部這些轉換基於的是笛卡爾坐標左手系(並且是沿X軸翻轉了180度的左手系),而不是右手系。假設你不清楚左手系和右手系,請查度娘。

設置轉換原點

轉換原點在縮放、傾斜和旋轉中非常重要,詳細參考各轉換。

轉換原點默認是元素的中心,即transform-origin: 50% 50% 0。

轉換矩陣

在二維空間中。轉換矩陣是一個3x3矩陣。在三維空間中,是4x4矩陣。

以下這個公式左邊的2x2矩陣。就是一個轉換矩陣,由於是2x2的,所以僅僅能做縮放、旋轉、傾斜,不能做平移。因此。實際上,瀏覽器使用的是3x3或4x4的矩陣。

矩陣右邊(x,y)是原坐標。(ax+cy, bx+dy)是轉換後的坐標。

技術分享

CSS 2D transforms

Translating –平移

平移和position:relative效果類似,不影響元素的物理空間位置。僅僅影響視覺空間位置,也就是說盡管看起來元素已經離開了原來的位置,但它所占的物理空間依舊是原來位置。並且僅僅在原位置上對其它元素有影響。

平移的距離即能夠使用像素值,也可使用百分比。假設是百分比,則盒子的寬高(width & height)決定了百分比的終於值,當中,水平位移取決於盒子寬度,垂直位移取決於盒子高度。

transform: translate(50px, 100px);
transform: translateX(50px);
transform: translateY(50%);
transform: translateY(100px);

在不支持的瀏覽器中。使用position:relative,然後通過top和left即能夠調整。

Scaling – 縮放

縮放即指放大或縮小,但效果僅僅相當於用放大鏡看,元素所占的物理空間依舊沒有變化。因此,放大或縮小元素,不影響周圍其它元素的布局。

當然,放大縮小也是有方向的,由於原點默認是中心點。所以默認是中心向四周放大。假設要改動放大縮小方向,須要改動transform-origin。

假設有一個值為0。那麽這個元素就看不到了;假設scale僅僅接受了一個參數,表示x和y方向縮放相同倍數。

transform: scale(2.5);
transform: scale(2, 1);
transform: scaleX(2);
transform-origin: left top;

Skewing – 傾斜

傾斜有向X軸傾斜和向Y軸傾斜。當中向X軸傾斜在視覺上是逆時針扭曲,向Y軸傾斜在視覺上是順時針扭曲。因此,假設X軸和Y軸傾斜角度相同。而正負相反,則等同於旋轉(rotate),旋轉方向由第一個值決定。

傾斜邏輯:一個維度傾斜的時候。還有一個維度的大小保持不變。比方。skew(30deg)。表示向X軸方向傾斜30度,但元素的縱軸高度保持不變。

因此,對於skew(30deg),第一象限空間的變換公式為x=x+y*tan(30deg)。

transform: skew(30deg);
transform: skew(30deg, 0);
transform: skew(30deg, -30deg);

註意:傾斜沒有3D轉換。

Rotating – 旋轉

二維旋轉事實上就是在三維空間上繞Z軸旋轉,旋轉方向為順時針方向,原點默認是元素的中心點,由於transform-origin的默認值為transform-origin:50% 50% 0。假設要把左上角設為原點。則應該設置transform-origin為transform-origin: 0 0 0。

transform: rotate(30deg);

CSS 3D transform

以下提到的3D轉換,在IE9都不支持。

Translating -平移

沿X和Y軸的平移是二維就支持的,這裏主要講怎樣沿Z軸平移。

想要看到3D效果的沿Z軸平移效果。首先父元素須要設置perspective,即元素前面離用戶的距離是多少。如今假設perspective為正值,即perspective>0px。

假設translateZ(shift)中。shift小於perspective。則表示元素依舊在用戶眼睛正前方,用戶始終能夠看到元素。假設shift大於perspective。則表示元素已經已到了用戶的後面,用戶看不到這個元素了。

並且你會發現shift在小於perspective的情況下,假設shift值越大,元素看起來也越大。這符合人眼看由遠及近的物體時所示情況。

另外,註意z軸坐標和z-index全然是兩碼事。互不影響。

transform: translate3d(50px, 100px, 0);

Scaling - 縮放

3D縮放須要註意的是縮放原點,原點決定了縮放方向。對視覺效果影響非常大。

Rotating – 旋轉

相同。要想看到3D旋轉效果。也須要父元素設置有perspective樣式,否則轉換方法rotate3d()、rotateX、rotateY、rotateZ的效果和在二維空間一樣,並且rotateX和roateY在二維空間是無效的。只是這最好還是礙rotate3d和rotateZ能夠做XY二維空間換算。比方,rotate3d(0, 0, 1, 10deg)就能夠讓元素在二維空間上順時針旋轉10度,同理,rotateZ(10deg)也能夠讓元素在二維空間上順時針旋轉10度。

transform: rotate3d(0, 0, 1, 30deg);

註意:ie9不支持rotate3d、rotateX、rotateY、rotateZ方法。

Perspective - 透視

透視距離表示z=0平面和用戶之間的距離,perspective>0表示z=0平面在用戶前面。否則在用戶後面。這時用戶就看不到這個元素了。

<div style="perspective: 50px;">
    <div style="translateZ(20px);">content</div>
</div>

上面這段代碼表示z=0平面離用戶50個像素,而content離z=0平面20個像素,也就是說如今content離用戶僅僅有30個像素。

因此。用戶看到的content比正常的要大。另外transform:perspective(50px)+transform-style:preserve-3d效果等同於perspective:50px。

但perspective:50px和transform:perspective(50px)有一個非常大的差別。就是perspective屬性的原點是perspective-origin。而transform的原點是tranform-origin。

兼容性

早版本號的Firefox、Chrome、Opera或IE,分別使用一下前綴兼容:

-moz-transform: rotate(30deg);
-o-transform: rotate(30deg);
-webkit-transform: rotate(30deg);
-ms-transform: rotate(30deg);
transform: rotate(30deg);

IE

IE的BasicImage濾鏡支持四個旋轉值:0,1, 2, 和 3分別相應0, 90, 180和 270度。

filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);

另外,IE有一個矩陣濾鏡。也能夠做到CSS的transform效果,詳細參考:https://msdn.microsoft.com/en-us/library/ms533014%28VS.85,loband%29.aspx

假設自己算不來。這裏另一個工具能夠幫助你計算:http://www.useragentman.com/IETransformsTranslator/。註意,用高版本號的IE在兼容模式下不一定能看這些效果。須要真實的該版本號IE才幹看到。

元素轉換-Transform