1. 程式人生 > >解鎖css3新姿勢之transform3D各屬性及transform相容之矩陣寫法

解鎖css3新姿勢之transform3D各屬性及transform相容之矩陣寫法

閒來無事,整理一下可以打造炫酷網站的一些transform的屬性

1. 矩陣transform:matrix()
這個矩陣哥們是有些厲害的,不得不多說兩句,這哥們可以同時寫上縮放,旋轉,拉伸,位移等變形;詳細內容見下面
2.transform-style:preserve-3d;創造3D空間
3.transform:rotate;2D旋轉;
4.transform:scale(倍數),縮放函式,取值正數,負數,小數;
5.transform:skew(xdeg,ydeg);拉伸函式或者斜切;
6.transform:translate();位移;


7.transform:可以同時有多種變形的樣式混寫

矩陣transform:matrix(),可以同時寫上縮放,旋轉,拉伸,位移等變形;

如果變形不用矩陣來寫的話,不相容ie9以下,js也不會獲取到deg度數;

所以用矩陣來用數字值來表達度數,讓js動態獲取;

transform:matrix(a,b,c,d,e,f);martrix共有6個值;

 初始值是matrix(1,0,0,1,0,0);  

相容ie9,需要另寫宣告:

filter:progid:DXImageTransform.Microsoft.Matrix(M11=1,M12=0,M21=0,M22=1
,SizingMethod='auto expand');

ie矩陣下沒有e和f兩個值,即沒有位移的值;具體位移可用定位來寫;

其中:M11==a;M12==b,M21=c,M22=d
矩陣實現縮放;
x軸的縮放:a=x*a   c=x*c  e=x*e;
y軸的縮放:b=y*b   d=y*d  f=y*f;d

如果只有縮放效果的話,那麼只寫a,d的值即可
如果有別的效果的話,matrix就不是預設值了,乘以相應的值即可;

.box{
                width:300px;
                height: 400px;
                border
:1px solid red
; margin: 50px auto 0; font-size: 100px; color:#fff; line-height: 400px; text-align: center; }
.div1{ width:300px; height: 400px; background: blue; transition: 3s; } .div1{ transform:matrix(0.5,0,0,0.5,0,0); filter:progid:DXImageTransform.Microsoft.Matrix(M11=0.5,M12=0,M21=0,M22=0.5,SizingMethod='auto expand');
矩陣實現位移;

transform:matrix(a,b,c,d,e,f);只需要改變ef的值
x軸的位移:x+e;
y軸的位移:y+f;
位移數值可以不用加px單位

如果至實現 x和 y位移100px的話,matrix程式碼如下

transform:matrix(1,0,0,1,100,100);

矩陣實現斜切;

矩陣的斜切是cb的值,c就是skewX的效果,b是skewY的效果;
而cb是角度的tan值;tan值的計算公式Math.tan(xDeg/180*Math.PI);
但是matrix只識別tan值,不能寫公式;
所以先計算tan值,可以用一個彈窗在網頁中彈出來計算的tan值,之後再寫在matrix中去
例如彈窗計算30度tan值程式碼

<script>
       alert(Math.tan(30Deg/180*Math.PI))
</script>

x軸的傾斜需要寫的值: c=Math.tan(xDeg/180*Math.PI);
y軸傾斜:b=Math.tan(yDeg/180*Math.PI);
例如實現只有x軸拉伸30度的效果

transform:matrix(1,0.577,0,1,0,0);
filter:progid:DXImageTransform.Microsoft.Matrix( M11=1, M12=0.577, M21=0 , M22=1,SizingMethod='auto expand');
矩陣實現旋轉;

transform:matrix(a,b,c,d,e,f);需要改變abcd的值

其中a d是相等的cos值;
b c是正負的sin值;
同樣的可以用彈窗計算相應的值
計算公式:
a=Math.cos(deg/180*Math.PI);
b=Math.sin(deg/180*Math.PI);
c=-Math.sin(deg/180*Math.PI);
d=Math.cos(deg/180*Math.PI);
例如彈窗計算30度的sin值

<script>
    alert(Math.sin(30/180*Math.PI));
</script>

如果之前沒有別的樣式,直接在abcd上寫上相對應的值即可;
如果之前有別的樣式,即abcd不是預設值了,那麼寫上計算出的abcd值乘以以前的值 ;