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

2021-01-11 前端達人

開篇

實現炫酷的網頁動畫效果,自然少不了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);
  • 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基本知識點
    怎麼理解盒子模型答案解析html的每個元素都可以理解成是一個盒子,包含內容有margin、border、padding、content4個屬性。盒子模型常見有兩種w3c 標準模型,IE模型。其中標準模型:width是指的content的寬度,而IE模型是指的content + padding + border的總和。
  • 常見的CSS文字居中顯示
    和vertical-align html<div> <span>測試文字</span></div>css.table{ display: table;}.cell{ display: table-cell; vertical-align: middle; text-align: center;}3、利用定位方式position+transform
  • 如何用純css打造類materialUI的按鈕點擊動畫並封裝成react組件
    : scale(12, 12);opacity: 0;transition: transform .6s cubic-bezier(.75,.23,.43,.82), opacity .6s;}&:active::after {transform: scale(0, 0);opacity: .5;
  • 網頁|你不知道的HTML——transform
    問題描述在之前寫的如何列印用六邊形組合的蜂窩狀圖形的博客中,有簡單的提到transform標籤。但是對於這個屬性的值,並沒有怎麼簡介。今天就來學習了解一下transform標籤吧!當我們使用transform對元素進行旋轉、縮放、傾斜、移動時,我們需要考慮transform的優先級。即rotate,scale,skew,translate。圖2.1下面就來了解一下這四個屬性:(1)rotate(旋轉)用法:transform: rotate(xxdeg)。單位deg為單位度的意思,正數為順時針旋轉,負數為逆時針旋轉,。
  • Pandas transform函數
    其中,transform()在處理行或列時非常有用。讓我們看看transform()是如何在一些示例的幫助下工作的。函數我們可以把函數傳遞給func。例如df = pd.DataFrame({'A': [1,2,3], 'B': [10,20,30] })def plus_10(x): return x+10df.transform(plus_10)也可以使用lambda表達式。
  • CSS常考知識點
    答案是改變transform或opacity不會觸發瀏覽器重新布局(reflow)或重繪(repaint),只會觸發複合(compositions)。而改變絕對定位會觸發重新布局,進而觸發重繪和複合。transform使瀏覽器為元素創建一個 GPU 圖層,但改變絕對定位會使用到 CPU。
  • HTML5+CSS+JS時間
    /css/page.css"type="text/css"rel="stylesheet"></head><body><divclass="Scanner"><h2>博客頁面登錄系統</h2><form><!
  • 如何使用 Julia 語言實現「同態加密+機器學習」?
    考慮到這一點,我們再看看如何在 Julia 中執行這些運算(注意:這裡有一些非常不安全的參數選擇,這些操作的目的是說明這個庫在交互式解釋器(REPL)中的用法)。尤其是,它是「長度為 3」的密文,範圍也更大。要說明它們是什麼,以及它們是做什麼用的有點太過複雜。我只想說,在進一步計算之前,我們要得讓這些值降下來,否則我們會盡密文中的「空間」。
  • 如何理解「自律者自由」?
    在近 30 年的人生歷程中,我對這句話的理解發生了非常顯著的變化,今天我就來聊聊在不同階段,我對「自律」的理解變遷。1. 自律不是一件道德高尚的事首先,明確一點:自律只是一種能力,而非品格。不是因為是英雄而能夠自律,而是在一次次面對誘惑時的「自縛」而成為英雄。想起一個朋友的一句經典的話:我把「思想政治與中日友好建設的辯證關係」的文件夾徹底刪除的那天,我覺得我墜出黑暗,重獲光明。
  • 「實用教程」- 使用PyMOL的Align進行蛋白結構疊合比對
    用法align mobile, target [, cutoff [, cycles [, gap [, extend [, max_gap [, object [, matrix [, mobile_state [, target_state [, quiet [, max_skip [, transform
  • 轉載 丨 好吧,CSS3 3D transform變換,不過如此!
    因此有:img:nth-child(1) { transform: rotateY(   0deg ); }img:nth-child(2) { transform: rotateY(  40deg ); }img:nth-child(3) { transform: rotateY(  80deg ); }img:nth-child(4) { transform
  • css font-family屬性設置元素的字體
    font-family屬性定義及用法在css中,font-family屬性是使用來規定元素的字體系列,把多個字體名稱作為一個「回退」系統來保存,如果瀏覽器不支持第一個字體,則會嘗試下一個。通常字體系列名稱:比如:"serif"、"sans-serif"、"cursive"、"fantasy"、"monospace"語法格式:css語法:font-family:字體1,字體2,...
  • 如何實現高速卷積?深度學習庫使用了這些「黑魔法」
    2019年,即使是智慧型手機也能在不到半秒內運行「重量級」CNN模型。而當我自己做了一個簡單的卷積層實現,發現這一個層的運行時間竟然超過2秒時,我非常震驚。大家都知道,現代深度學習庫對大部分運算具備高度優化的生產級實現。但是這些庫使用了哪些人類不具備的「黑魔法」呢?它們如何將性能提升100倍?當它們「優化」或加速神經網絡運算時,它們在做什麼?
  • 「深度思考」什麼是批判性思維?如何培養一個人的批判性思維?
    明白了我們為什麼需要批判性思維,以及為什麼批判性思維這麼重要,我們也要避免流於「為反對而反對」,那麼如何培養一個人擁有批判性思維去批判性思考呢?1、 學會提問。只有當我們理解了一個論證中的關鍵詞句時,我們才能對這個論證進行評價。
  • 「好棒」的日文怎麼說?6種誇讚他人的日文,不要只會「鼠勾以」
    想用日文說「贊啦!」、「好棒棒!」該怎麼講?「棒」的程度不同,表達方式當然也不一樣,這篇要一次教你6種誇讚他人的超簡單日文,下次不要只會講「鼠勾以」啦!(すばらしいsubarashii)接下來要介紹容易搞混的「素晴らしい」和「素敵」,兩個詞同樣都是主觀的「好棒」,但用法不盡相同,有時候用顛倒的話還會產生誤會!首先來看看「素晴らしい」(すばらしいsubarashii),通常是形容人事物的「內容、本質」很棒。
  • 如何理解「刑囚夾印,刑杖惟司」這句古訣?紫微鬥數師生問答
    學生問:周老師,如何理解「刑囚夾印,刑杖惟司」這句古訣?周師答:前些日子我們談過「刑忌夾印」的問題,說的是天相這顆印星的兩夾宮,分別有一顆刑星與忌星,很好理解。今天我們再來談一下「刑囚夾印」的問題,此時的印星仍然是指天相,但是這裡的刑星與囚星卻不在兩夾宮了,而是與天相同宮。具體是這樣的,在《紫微鬥數全書》的《太微賦》篇中有如下記載,「刑囚夾印,刑杖惟司。註:假如午宮安命,遇有天同貪狼擎羊,丙戊人逢之,化吉,雖以羊刃在命,亦為美論;富貴皆可許也,只不耐久。假如身命有天相,卻被羊貞夾之,主人逢官非受刑杖,終身不能發達,只宜僧道。」
  • 「因此」、「所以」英語怎麼說?五分鐘讓你完全搞懂
    「因此…」、「所以…」最常見的英語說法是therefore或so。但其實還有更多用法可以來表達「因此..」、「所以..」的英語。以下整理了四種「因此…」、「所以…」的英語用法,趕快學起來增強英語能力吧!