「css基礎」如何理解transform的matrix()用法

2020-12-16 前端達人

開篇

實現炫酷的網頁動畫效果,自然少不了css3中transform的屬性,此屬性功能豐富且強大,比如實現元素的位移translate(x,y),縮放scale(x,y),2d旋轉rotate(angle),傾斜變換skew(x-angle,y-angle)等,利用這些屬性可以實現基本的動畫效果,如果你要實現自定義和像素級別控制的高級動畫效果,我們還需要深入了解它的另外一個屬性——matrix,matrix就是矩陣的意思,聽起來是不是很高級,你沒聽錯實現更高級的效果,你需要了解「矩陣」,聽到「矩陣」,是不是很驚慌,當初筆者學習線性代數時也甚是無聊,真不知道這門課有啥用,沒想到這門課在計算機領域應用十分廣泛,比如本文說的動畫效果,還有現在火爆的人工智慧,真是悔不當初,當時沒有好好學習這麼課程。

本篇文章,筆者將從以下幾個方面進行介紹:

向量與矩陣基礎知識一個matrix()的例子matrix()參數詳細介紹

本篇文章閱讀時間預計6分鐘。

01

向量與矩陣基礎知識

關於這部分內容,有線性代數基礎的同學們可以忽略本部分內容,在這裡筆者只會介紹最基礎的內容,主要涉及什麼是向量和矩陣,以及對應的基礎運算。

向量

向量被用於許多科學領域用來描述方向和大小,我們一般用笛卡爾坐標系進行向量的描述,向量簡單的來說就是把數排成一列或一行進行展示,比如向量(2,1)和(3,3)在坐標系中表示如下:

假設我們現在有兩個向量AB(8,2)和向量AC(2,6),我們對其進行加、減、乘運算,示例如下:

向量加法:

AB+AC=AD(8,2)+(2,6)=(8+2,2+6)=(10,8)

向量減法:

AB-AC= AD(8,2)-(2,6)=(8-2,2-6)=(6,-4)

向量乘法:

ABAC = AD(8,2)(2,6)=(82,26)=(16,12)

從上述例子我們可以看出,向量的運算即為每個向量對應的位置進行兩兩相加、兩兩相減或兩兩相乘。

矩陣

簡單來說把數排列成長方形就是矩陣,我們一般用幾行幾列來描述矩陣,比如 22 矩陣,23 矩陣等,乘號左邊代表行數,乘號右邊代表列數,如下圖所示表示22 的矩陣:

矩陣相加:

相同規模(行數列數都相等)的矩陣之間的加法如下圖所示:

我們可以看出是對應的位置兩兩相加而得。

矩陣相乘

1、矩陣與向量相乘,示意圖如下:

從圖可以看出矩陣與向量相乘結果為向量,矩陣每行的數字分別與向量每行對應的位置分別相乘最後將結果相加,得到結果向量。

2、矩陣與矩陣相乘

比如 24 的矩陣與 43 的矩陣相乘我們得到一個 23 的矩陣,如下圖所示:

從圖示中我們可以看出,我們左邊矩陣的每行與右邊矩陣的每列分別相乘,相乘規則如矩陣與向量相乘的規則一樣,最終得到矩陣的行數等於左邊矩陣的行數,列數等於右邊矩陣的列數。

02

一個matrix()的例子

介紹完基本向量和矩陣的知識後,我們來看看一個matrix()的例子,transform:matrix(a,b,c,d,ex,fy)一共六個參數,用矩陣表示如下圖所示:

註:參數書寫的方向是豎著寫的。

這六個參數代表什麼意思,這裡先不做介紹,稍後會詳細介紹,現在我們有這樣一個元素,其對應的CSS屬性如下:

#transformedObject { position: absolute; left: 0px; top: 0px; width: 200px; height: 80px;}

此段代碼,對應的頁面效果如下:

從上圖我們可以看出,此長方形的四個頂點從左頂點開始,順時針方向對應的坐標分別為:(0,0)、(200,0)、(200,80)、(0,80),我們對其進行transform:matrix(0.9, -0.05, -0.375, 1.375, 220, 20)變換,css代碼如下:

#transformedObject { position: absolute; left: 0px; top: 0px; width: 200px; height: 80px; transform: matrix(0.9, -0.05, -0.375, 1.375, 220, 20); transform-origin: 0 0;}

註:transform-origin是變形原點,也就是該元素圍繞著那個點變形或旋轉,該屬性只有在設置了transform-origin屬性的時候起作用。

應用這個屬性後的效果如下圖:

好奇的你,你一定困惑這四個點的值是怎麼得出來的呢,其實有了前面的向量和矩陣知識,我們很容易算出,matrix(0.9, -0.05, -0.375, 1.375, 220, 20)用矩陣表示如下圖所示:

元素最初的每個頂點相當一個向量,例如(200,0)可用下圖表示:

變換後的四個點的坐標值,其實是matrix(0.9, -0.05, -0.375, 1.375, 220, 20)對應的矩陣與原始四個點對應的向量分別相乘而得,具體的運算過程如下圖:

與(200, 80)相乘的運算過程得到點(370,120):

與(200, 0)相乘的運算過程得到點(400,10):

與(0, 80)相乘的運算過程得到點(190,130):

與(0,0)相乘的運算過程得到點(220,20):

經過運算後,我們得到最終變換後的四個頂點坐標: (220,20),(400,10),(370,120),(190,130)

03

matrix參數詳細介紹

通過前面的學習,我們學到了向量和矩陣的基礎知識,一個matrix()變換的例子,我們通過矩陣運算算出了變換後的結果。接下來我們一起學習下transform:matrix(a,b,c,d,tx,ty)這六個參數代表的意義,其實這六個參數,對應的是translate(x,y),scale(x,y),rotate(angle),skew(x-angle,y-angle)這些效果,每種變換效果對應的參數不同,如下圖總結:

現在有這個需求,我們對元素進行順時針旋轉15度,X軸方向右移230px, X軸方向擴大1.5倍,我們使用基本的變換屬性代碼如下:

#o1 { transform-origin: 0px 0px; transform: rotate(15deg) translateX(230px) scaleX(1.5);}

如果用transform:matrix()怎麼實現如上的相同效果呢,其實我們可以利用transform:matrix(a,b,c,d,tx,ty)這六個參數對應的總結(如上圖),其實就是每種變換對應的矩陣參數相乘的結果得到這6個參數值,記住一定要按照rotate,translateX,scaleX對應的順序進行舉行相乘(矩陣相乘順序不同結果不同),如下圖所示:(運算的結果筆者就不寫了,留給大家練習下矩陣相乘)

今天的內容就介紹到這裡,我們理解了transform這個高級屬性——matrix()矩陣屬性,通過這個屬性我們了解其背後的數學邏輯,只有理解掌握這個屬性後,我們才能實現更為複雜的動畫效果。

相關焦點

  • 理解transform中的matrix
    css裡的默認變換中心是對象中心,transform-origin可以指定變換中心,我猜測是先平移到原點進行變換,再平移回原位置,如果你知道答案請告訴我。二維縮放 平移旋轉縮放transform的matrix 到這一步就得知六個值得起源以及修改哪些值可以實現相應的效果了,使用時套用公式即可。慄子 平移transform: matrix(1,0,0,1,50,50);
  • 前端開發必會的HTML/CSS硬知識
    : rotate(0); -webkit-transform: rotate(0); -moz-transform: rotate(0); -o-transform: rotate(0); transform: rotate(0);}「CSS前綴自動補全:autoprefixer」3.2
  • CSS3 transform之scale縮放|transition之過渡動畫調整手記
    既然是滑鼠移上去後再發生變化,那首先需在css文件中,針對圖片的hover增加個樣式,縮放比例為1.1。如下:.index-list-tu li a img:hover {-webkit-transform: scale(1.1,1.1);-moz-transform: scale(1.1,1.1);transform: scale(1.1,1.1);}
  • CSS工程化
    ,並不知道最終的類名是什麼,那如何應用類名到元素上呢?css module僅處理頂級類名,儘量不要書寫嵌套的類名,也沒有這個必要css module還會處理id選擇器,不過任何時候都沒有使用id選擇器的理由使用了css module後,只要能做到讓類名望文知意即可,不需要遵守其他任何的命名規範解決重複樣式的問題「css in js」
  • 「學習筆記」HTML基礎
    「學習筆記」HTML基礎前言    勤做筆記不僅可以讓自己學的紮實,更重要的是可以讓自己少走彎路。有人說:"再次翻開筆記是什麼感覺",我的回答是:"初戀般的感覺"。或許筆記不一定十全十美,但肯定會讓你有種初戀般的怦然心動。
  • css晦澀難懂的點都在這啦
    : css大三特性是css最重要的部分,可以說如果了解了這三大特性就對css撐握了一半,對於屬性只不過是記不記的住的事,而這個是重在理解。❞選擇器❝在講這三個特性之前我們需要來全面了解下選擇器。translate3d(x, y, z)「3D的特點」「三維坐標系」x 軸:水平向右  -- 「注意:x 軸右邊是正值,左邊是負值」y 軸:垂直向下  -- 「
  • 「CSS 3D 專題」搞懂 CSS 3D,你必須理解 perspective(視域)這個屬性
    裡,我們一起了解什麼是CSS 3D,本篇章節筆者將帶著大家學習 perspective(視域)這個重要屬性,在我們接觸 CSS 3D 時,大多數開發人員都使用過,但是深入理解其原理的不知有多少。首先強調下,理解這個屬性至關重要,這個 perspective(視域)屬性通常作用在外部容器元素上,例如body,figure和 div 等標籤上。這樣我們就在3D空間操作內在的子元素。
  • 基礎日語——助詞「が」用法介紹及與「は」的簡單區分
    與其他助詞相比,助詞「が」用法不多,最常見的就是表示主格和表示對象的用法。對於日語初學者來說,「が」表示主格的用法很容易就和助詞「は」發生混用,今天小編在介紹「が」用法的基礎上,對二者的用法的作一下簡單的區分,希望能幫助初學日語的小夥伴們消除一些疑惑。
  • 「趣圖」!important,css js 用法咋就完全相反呢?設計者被噴慘
    important在我告訴你它到底是css,還是javascript之前,你永遠不知道它是什麼意思。css說,這非常重要,排在第一位;js說,這個不重要,是否定句。同時前端片刻不能離開的句子,相愛相殺到何時。
  • CSS3:transform與transition背後的數學原理
    transform的原理是計算機圖形學中的2D矩陣變換,在開始之前,首先來複習下一個簡單的線性代數知識:矩陣與向量乘法。太復的用不到,只需要3維向量與3x3矩陣的乘積:接下來我們來說說transform跟矩陣乘法的關係,我們的任何一個html元素渲染完成後可以得到一張位圖,把這張位圖上所有的點都做一次矩陣運算,將得到一張的新的位圖,這就是transform的基本含義。首先來看最簡單的transform,translate。
  • 大狗乾貨鋪子:CSS3 變形、過渡、動畫、關聯屬性淺析
    變形transform:可以對元素對象進行旋轉rotate、縮放scale、移動translate、傾斜skew、矩陣變形matrix。示例:transform: rotate(90deg) scale(1.5,0.8) translate(100px,50px) skew(45deg,45deg);/*矩陣變形*/matrix(transition:過度屬性transition:過度效果的css屬性名 過度效果時長 速度效果的速度曲線 過度效果開始時間
  • 前端開發和網頁設計的CSS轉換屬性
    除了maybematrix之外,所有的值都是很清楚的。旋轉和傾斜選項使用角度度數(值可以是負數,可以輸入超過360度)。例如,輸入1080deg進行三個完整的旋轉。scale選項只使用數字,並且根據給定的寬度和高度的參數定義該對象的增加/減少程度。
  • 「趣圖」這是我用CSS修好的5em的眉毛,不喜勿噴
    歷史文章精選1 「趣圖」程式設計師說,樹,要倒過來才好看!路人蒙了2 「趣圖」我的前任怕 commit 代碼,而你一年 GitHub 87365 次提交!3 「趣圖」感謝 POSIX,感謝 GNU,沒有你們就沒有今天的 Linux!4 「趣圖」!
  • 「の/んです」的用法
    在日本,「の/んです」一詞出現在人們日常對話中的頻率非常高。相信學習日語的小夥伴對它也並不陌生。然而,絕大多數日語學習者想要完全理解「の/んです」的含義,並掌握「の/んです」的用法卻是有難度的。 對於日語初學者而言,在使用「の/んです」時一定要謹慎。「の/んです」在部分日語中會帶有驚訝、懷疑、甚至於不耐煩的語氣,如果你對「の/んです」的使用不恰當,則很有可能導致你說出的句子的含義發生性質上改變,而你口中這個錯誤的句子很容易令對方造成誤解甚至引起對方的不悅。所以,在日語學習的初級階段,掌握好以上三種代表性用法至關重要。
  • 【練習題】20道CSS基礎測試題
    ()A、<style src="mystyle.css">B、<link rel="stylesheet" type="text/css" href="mystyle.css">C、<stylesheet>mystyle.css</stylesheet>
  • 掌握pandas中的transform
    圖12 pandas中的transform在pandas中transform根據作用對象和場景的不同,主要可分為以下幾種:2.1 transform作用於Series當transform作用於單列Series時較為簡單,以前段時間非常流行的「企鵝數據集」
  • 「と」「ば」「たら」「なら」的用法之「と」的用法
    四個詞在用法上很有多相似之處,學生在使用的時候,經常會發生錯誤,我們就一個個看看他們到底有什麼不!一!樣!「と」-「ば」-「たら」-「なら」的用法「と」強調前項為後項的契機,因此と主要是用來表示事物之間的相互關係,前項並非是人為地主觀提出條件,後項也不是說話人的主觀性的意志和主張。
  • [重拾CSS]一道面試題來看偽元素、包含塊和高度坍塌
    */p::first-line {  color: blue;  text-transform: uppercase;}偽類和偽元素區別通過上述,我們可能大致理解了但是對於一些看上去用途很相似的偽類和偽元素還是有點迷糊。
  • CSS新手教程:transform-origin屬性詳解 實操使用效果示例
    .box{    transform:rotate(45deg);}Alt text.box{    transform:rotate(45deg);}Alt text此時我們給元素設置一個縮放因子scale(0.5).box{    transform:scale(0.5);}
  • CSS樣式「程式設計師培養之路第六天」
    溢出隱藏:overflow設置當對象的內容超過其指定高度及寬度時如何顯示內容visible 默認值,內容不會被修剪,會呈現在元素框之外。hidden 內容會被修剪,並且其餘內容是不可見的。樣式,為了界面美觀,很多元素自帶margin、padding等樣式,但這些樣式在不同瀏覽器解析的值都不一樣,需要將css樣式重置,保證在不同瀏覽器顯示一致。