1. 程式人生 > >CSS變形transform(2d)

CSS變形transform(2d)

前面的話

   CSS變形transform是一些效果的集合,主要是移動、旋轉、縮放和傾斜這四種基本操作,還可以通過設定matrix矩陣來實現更復雜的效果。變形transform可以實現2D和3D兩種效果。2D變形涉及的屬性主要有transform變形函式和transform-origin變形原點。本文將詳細介紹變形transform2d的相關知識。為了更清楚地說明變形的整個過程,本文的DEMO中大量使用了CSS過渡transition。關於CSS過渡transition的詳細情況移步至此

變形原點(2維)

  變形原點transform-origin是指變形操作所依據的基點。預設情況下,變形原點位於元素的中心點

transform-origin

  值: x軸 y軸 z軸

  初始值: 50% 50%

  應用於: 非inline元素(包括block、inline-block、table、table-cell等)

  繼承性: 無

  [注意]IE9-瀏覽器不支援,safari3.1-8、android2.1-4.4.4、IOS3.2-8.4都需要新增字首,其他更高版本瀏覽器可使用標準寫法

  2維的變形原點transform-origin是由x軸和y軸兩個軸的值共同確定的(不考慮3維的情況,z軸的值預設為0)

x軸: left | center | right | <length> | <percentage>
y軸: top 
| center | bottom | <length> | <percentage>

【1】關鍵字

x軸
left: 0%  center: 50%  right: 100%
y軸
top: 0%  center: 50%  bottom: 100%
//以rotate()旋轉函式來說明變形原點。rotate(90deg)表示元素沿順時針旋轉90角度

【2】數值

  x軸數值表示在x軸上離0點(元素邊框外側左上角)的偏移量;y軸數值表示在y軸上離0點的偏移量

//以rotate()旋轉函式來說明變形原點。rotate(90deg)表示元素沿順時針旋轉90角度

【3】百分比

  其中x軸的百分比相對於元素的寬度和(width+橫向padding+橫向border),即包含塊的寬度;而y軸的百分比相對於元素的高度和(height+縱向padding+縱向border),即包含塊的高度

//以rotate()旋轉函式來說明變形原點。rotate(90deg)表示元素沿順時針旋轉90角度

【4】單個值

  當只有一個值時,預設第二個值為center

//以rotate()旋轉函式來說明變形原點。rotate(90deg)表示元素沿順時針旋轉90角度

變形函式(2維)

  變形transform是一系列變形函式的集合

transform

  值: none | <transform-function>+

  初始值: none

  應用於: 非inline元素(包括block、inline-block、table、table-cell等)

  繼承性: 無

<transform-function>: translate | scale | rotate | skew | matrix

[注意]transform中出現多個變形函式時用空格分隔

  [注意]位移、縮放、旋轉和傾斜這四個操作中除了位移與變形原點無關,其餘三個都與變形原點有關

矩陣matrix

  實際上,位移、縮放、旋轉和傾斜這四個操作都是通過矩陣matrix實現的

  matrix(a,b,c,d,e,f)函式有a,b,c,d,e,f這6個引數。而x和y是變形前元素的任意點。通過以下矩陣變換,生成對應的新座標x'和y'。

x' = ax + cy + e;
y' = bx + dy + f;

  由此可得到預設a、d為1,b、c、e、f為0。a和d控制縮放,且不可為0;c和b控制傾斜;而e和f控制位移

  [注意]matrix()方法的最後兩個引數,對於chrome瀏覽器來說,預設是px單位,可以不寫單位。但是,在firefox瀏覽器下,需要新增單位

映象對稱

對稱軸一定通過元素變換的中心點,k是對稱軸的斜率

matrix((1-k*k)/(1+k*k),2k/(1+k*k),2k/(1+k*k),(k*k-1)/(1+k*k),0,0)

位移

  translate位移函式可以使元素從原來的位置上移動指定的位移。涉及位移的2d函式共3種,分別是translate()、translateX()、translateY()

  [注意]元素髮生位移後,元素的x軸和y軸跟著也一併移動,若元素再進行其他的變形操作,則要沿著改變後的x軸和y軸進行變形

translate(x[,y]?)

  x表示元素在x軸方向上的位移;y表示元素在y軸方向上的位移

  [注意]當y不存在時,相當於y=0

translateX(x) 相當於 translate(x,0)

  x表示元素在x軸方向上的位移

translateY(y) 相當於 translate(0,y)

  y表示元素在y軸方向上的位移

  [注意]位移函式相當於matrix(1,0,0,1,x,y)

  位移函式還可以接受百分比。其中x%相對於元素水平方向的寬度和,y%相對於元素垂直方向的高度和

  [注意]IE10瀏覽器有bug,元素的位移函式的百分比是相對於元素的可視寬高(不包括邊框)而言的

//元素的主要樣式為width:100px;height:100px;padding:10px;border:10px solid black;

縮放

  scale縮放函式可以讓元素根據變形原點進行縮放,預設縮放值為1。涉及縮放的2d函式共3種,分別是scale()、scaleX()、scaleY()

  [注意]當元素被縮放後,若元素要進行位移,數值型別的位移值要乘以該縮放比例;百分比型別的位移值乘以原來的寬度和或高度和轉換成數值型別後,再乘以縮放比例

scale(x,[,y]?)

  x表示元素在x軸方向上的縮放比例;y表示元素在y軸方向上的縮放比例

  [注意]當y不存在時,相當於y=x

  [注意]當x或y的值為負值時,元素先翻轉再縮放

scaleX(x) 相當於 scale(x,1)

  x表示元素在x軸方向上的縮放比例

scaleY(y) 相當於 scale(1,y)

  y表示元素在y軸方向上的縮放比例

  [注意]縮放函式相當於matrix(x,0,0,y,0,0)

傾斜

  skew傾斜函式可以讓元素以其變形原點圍繞x軸和y軸進行一定角度的傾斜。涉及傾斜的2d函式共3種,分別是skew()、skewX()、skewY()

  [注意]元素傾斜後,x軸和y軸發生傾斜,若元素要進行其他變形操作,則沿著傾斜後的x軸和y軸進行變形

skew(xdeg,[,ydeg]?)

  x表示y軸向x軸傾斜的角度,y表示x軸向y軸傾斜的角度

  [注意]當y不存在時,相當於y=0

  [注意]x>0時,表示y軸向x軸正方向傾斜;x<0時,表示y軸向x軸負方向傾斜

  [注意]y>0時,表示x軸向y軸正方向傾斜;y<0時,表示x軸向y軸負方向傾斜

skewX(x) 相當於 skew(x,0)

  x表示y軸向x軸傾斜的角度

skewY(y) 相當於 skew(0,y)

  y表示x軸向y軸傾斜的角度

  [注意]傾斜函式相當於matrix(1,tany,tanx,1,0,0)

旋轉

  rotate旋轉函式可以讓元素通過指定的角度(deg)根據變形原點進行順時針旋轉,預設為0deg。與skew不同的是,rotate不會改變元素的形狀。涉及到旋轉的2d函式只有一個,就是rotate()

  [注意]元素旋轉後,元素的x軸和y軸也跟著發生旋轉。若元素要進行其他變形操作,則沿著旋轉後的x軸和y軸進行變形

rotate(Ndeg)

  [注意]當N為正數時,元素進行順時針旋轉;當N為負數時,元素進行逆時針旋轉

  [注意]旋轉函式相當於matrix(cosN,sinN,-sinN,cosN,0,0)

多值

  transform變形可以接受多值,出現多個變形函式時用空格分隔,並且按照從前往後的順序執行。

transform: <transform-function1> <transform-function2> <transform-function3>...

【1】多個變形函式的先後關係可以轉換為多個元素的巢狀關係

<div style="transform:rotate(45deg) translateX(100px)"></div>
相當於
<div style="transform:rotate(45deg)">
  <div style="transform:translateX(100px)"></div>
</div>
.box{
  width: 100px;
} 
.in{
  background-color: pink;
  height: 100px;
}
.out{
  background-color: lightblue;
  height: 100px;
}
<div class="box">
    <div class="out" style="-webkit-transform:rotate(45deg) translateX(100px);transform:rotate(45deg) translateX(100px);"></div>
    <div style="-webkit-transform:rotate(45deg);transform:rotate(45deg)">
      <div class="in" style="-webkit-transform:translateX(100px);transform:translateX(100px)"></div>
    </div>    
</div>

【2】變形transform中的多個變形函式的執行順序是從前向後依次執行

//第一種情況:旋轉45deg後,元素的x軸正向變成右下45deg,所以元素接下來的位移向這個方向移動
//第二種情況:元素向右移動100px後,元素的原點跟著元素一起平移,並一直在元素的中心位置,所以元素接下來的旋轉是原地旋轉