天天看點

CSS3(五) Transform的實作原理Transform

Transform

CSS3中,

transform

屬性允許盒子模型被進行二維或三維空間坐标的變換。使用該屬性之後,元素主要可以進行以下變換:
  • 旋轉(rotate)
  • 平移(translate)
  • 縮放(scale)
  • 傾斜(skew)

下面的圖檔我們實作了一個旋轉和縮放的變換、然後結合animation屬性實作了一種常見的動畫效果。

CSS3(五) Transform的實作原理Transform

項目源碼

Transform API

通過文章開頭介紹的幾種變換,我們可以簡單概括為:

屬性 描述 demo
translate(x,y) 平移變換 [注意 x,y有機關] 測試
scale(x,y) 縮放變換 [x,y無機關] 測試
rotate(angle) 旋轉變換[機關為弧度,deg] 測試
skew(angleX,angleY) 拉伸變換[機關為弧度,deg] 測試
matrix(a,b,c,d,e,f) 變換矩陣[重點] 測試

基本的用法現在網上都能查詢到,這裡就不再贅述了。下面主要講一下matrix。

Matrix

中文譯為”矩陣”,在本文中可以了解為transform模闆函數。那麼矩陣到底有什麼用呢?相信大家都在大學或多或少了解過線代,我所了解的矩陣它的本質就是線性方程組,通過建立一種對應關系,得到目标結果的一種工具。

下圖是一個矩陣方程,它的作用就是将原有坐标值(X0,Y0)通過某種變換,轉換目标值(X1,Y1)。

CSS3(五) Transform的實作原理Transform
那麼,matrix和transiform之間有什麼聯系?

通過了解到矩陣的作用,那麼我們可以想象,所謂的transform變換就是一系列的坐标值轉換。

假設有一種模闆矩陣, 它的功能就是将我們原有的坐标值,通過模闆矩陣的處理,實作平移、旋轉、縮放、拉伸等效果的轉換過程。

簡單的概括就是,我想要實作一個平移的效果。隻需要實作三個步驟即可:

  1. 初始化一個圖形
  2. 建立一個模闆矩陣
  3. 将模闆矩陣應用到初始化圖形中

matrix 模闆矩陣

下面是常見的幾個矩陣模闆:

CSS3(五) Transform的實作原理Transform
屬性 描述 demo

matrix(1, 0, 0, 1, e, f)

平移 測試

matrix(a, 0, 0, d, 0, 0)

縮放 測試

matrix(cosθ,sinθ,-sinθ,cosθ,0,0)

旋轉 測試

matrix(1,tan(θy),tan(θx),1,0,0)

拉伸 測試

再進一步學習之前,先來回顧一些基礎線代知識:

矩陣乘法

計算規則是,第一個矩陣第一行的每個數字(a和b),各自乘以第二個矩陣第一列對應位置的數字(1和2),然後将乘積相加( a x 1 + b x 2),得到結果矩陣左上角的那個值a+2b。
CSS3(五) Transform的實作原理Transform
平移(translate)
CSS3(五) Transform的實作原理Transform

數學意義是:

其中,(x0,y0)為起始點坐标,(x1,y1)就是我們要輸出的目标坐标值。

不難發現,e,f就是我們想要的橫縱坐标上的偏移量。

CSS3(五) Transform的實作原理Transform

從上面的矩陣公式。我們得出,通過模闆矩陣相乘,就可以得到目标函數的坐标值。

思考題:為什麼坐标值格式會是(x,y,1),而不是(x,y)呢。這個1代表的是什麼?

縮放(scale)

有了上面的鋪墊,下面的縮放就比較簡單了。

首先想一想,縮放的原理是什麼?

縮放就是将x,y在對應橫縱軸上進行等比例的伸長或縮小。
CSS3(五) Transform的實作原理Transform

數學意義:

a, d 就是橫縱坐标的伸縮量。
CSS3(五) Transform的實作原理Transform

思考題:為什麼b,c會設定為0?

旋轉(rotate)

[注意] 本文僅介紹繞原點的二維旋轉。

旋轉變換就明顯與上面的兩種有質的飛躍了,因為前兩種隻是單純的線性變換,旋轉變換就加上了一種新的因素(弧度)。

CSS3(五) Transform的實作原理Transform
CSS3(五) Transform的實作原理Transform

數學意義:

v繞原點旋轉θ 角,得到點v’,假設 v點的坐标是(x, y) ,那麼可以推導得到 v’點的坐标(x’, y’)(設原點到v的距離是r,原點到v點的向量與x軸的夾角是ϕ )
CSS3(五) Transform的實作原理Transform

[拓展] 旋轉矩陣的推導原理:

  • 首先是(x0,y0)關于弧度的表達式:
CSS3(五) Transform的實作原理Transform
  • (x1,y1)關于弧度的表達式:(1式)
CSS3(五) Transform的實作原理Transform

展開上面的三角函數,(2式)

CSS3(五) Transform的實作原理Transform
  • 将1式代入到2式,得
CSS3(五) Transform的實作原理Transform
拉伸(skew)

拉伸變換也可以稱為傾斜變換或斜切變換。

數學意義:

傾斜的意義就是在于原點是一個動态值,然後再繞水準或豎直方向進行一定角度的傾斜。效果就類似于拉伸一個彈性物體。
CSS3(五) Transform的實作原理Transform

思考題:自行推導一下。

tips:
CSS3(五) Transform的實作原理Transform
CSS3(五) Transform的實作原理Transform

好了,基本的圖形變換的數學原理已經講完了,以後還有後續的公式來進行擴充。謝謝~

CSS3(五) Transform的實作原理Transform

繼續閱讀