整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

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

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

          今天筆者將從以下幾個方面進行介紹:

          • 向量與矩陣基礎介紹
          • matrix()示例
          • matrix參數詳細介紹

          向量與矩陣基礎介紹

          關于這部分內容,有線性基礎的同學們可以忽略往下看,在這里筆者只會介紹最基礎的內容,什么是向量和矩陣,以及對應的基礎運算。

          向量

          向量被用于許多科學領域用來描述方向和大小,我們一般用笛卡爾坐標系進行向量的描述,向量簡單的來說就是把數排成一列或一行進行展示,比如向量(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)

          向量乘法

          AB??AC = AD

          (8,2)??(2,6)=(8??2,2??6)=(16,12)

          矩陣

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

          矩陣相加

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

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

          矩陣相乘

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

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

          2、矩陣與矩陣相乘

          比如 2??4 的矩陣與 4???3 的矩陣相乘我們得到一個 2??3的矩陣,如下圖所示

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

          matrix()示例

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

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

          這六個參數代表什么意思,這里先不做介紹,稍后會詳細介紹,我們先從一個例子的應用來講起,現在我們有這樣一個元素,其對應的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屬性的時候起作用;

          應用變換后的效果如下圖

          這四個點的值,是怎么得出來的呢,其實有了前面的向量和矩陣知識,我們很容易算出,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)

          matrix參數詳細介紹

          上一小節(jié),我們學習了如何利用向量和矩陣的知識,我們算出了元素經過matrix()變換后的最終結果,現在我們詳細介紹下transform:matrix(a,b,c,d,tx,ty)這六個參數的意義,其實這六個參數,對應的是translate(x,y),scale(x,y),rotate(angle),skew(x-angle,y-angle)這些效果,每種變換效果對應的參數不同,如下圖總結:

          假如我們對元素進行旋轉15度,往右動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對應的順序進行舉行相乘,如下圖所示(運算的結果筆者就不寫了,留給大家練習下矩陣相乘)

          小節(jié)

          今天的內容就到這里,我們了解了transform除了有translate(x,y),scale(x,y),rotate(angle),skew(x-angle,y-angle)這些屬性實現動畫變換,還有一個高級屬性matrix(),通過這個屬性我們了解其背后的數學邏輯,只有掌握這個屬性后,我們才能實現更為復雜的動畫。

          更多精彩內容,請微信關注”前端達人”公眾號!

          SS 在您可以修改的內容方面非常強大,并且該transform屬性是最通用和最強大的 CSS 屬性之一。在本文中,我將介紹使用transform屬性修改 CSS 元素的所有方法。

          什么是變換屬性?

          CSS 中的transform屬性只是一種您可以在一個屬性中旋轉、縮放、移動等元素的方式。由于這種靈活性,如果起初使用起來可能會令人困惑,但本文將消除所有這些困惑。

          .class {
            transform: rotate(90deg) scale(2) translate(100px, 200px);
          }
          

          transform通過組合多個變換函數來獲得所需的輸出,因此為了理解transform您需要了解每個transform函數。

          rotate

          可能最容易理解的變換函數是rotate. 此函數采用單個參數,即旋轉元素的角度。正值將導致順時針旋轉,負值將導致逆時針旋轉。

          .red {
            transform: rotate(10deg);
          }
          .green {
            transform: rotate(-45deg);
          }
          .blue {
            transform: rotate(.25turn);
          }
          

          正如您在上面的示例中看到的,我們使用degturn單位來定義我們的旋轉。deg單位從 0 到 360,而turn單位從 0 到 1。

          3D 旋轉

          rotateX您還可以使用、rotateYrotateZ函數進行 3D 旋轉。該rotateZ功能的工作原理與rotate.

          rotateX將在水平軸上rotateY旋轉一個元素,并將在垂直軸上旋轉一個元素。這些可用于翻轉元素。

          .red {
            transform: rotateX(60deg);
          }
          .green {
            transform: rotateY(60deg);
          }
          .blue {
            transform: rotateX(.2turn) rotateY(.2turn);
          }
          

          如您所見,我們在 3D 空間中旋轉元素,使其看起來被擠壓。這種旋轉實際上只在處理 3D 元素時才有用。

          scale

          scale是另一個很容易理解的函數。它可以采用一個或兩個參數來確定元素大小的縮放比例。大于 1 的數字會使元素變大,而小于 1 的數字會縮小元素。

          .red {
            transform: scale(1.25);
          }
          .green {
            transform: scale(.5);
          }
          .blue {
            transform: scale(1.25, .75);
          }
          

          當一個參數被傳遞給scale它時,它會根據傳遞的數字縮放 X 和 Y 軸相同的量。當兩個值傳遞給scale第一個數字時,將縮放 X 軸,第二個數字將縮放 Y 軸。

          此外,如果您愿意,可以使用scaleXandscaleY函數來縮放 X 或 Y 軸。這些函數采用一個參數并在相應軸上縮放元素。

          3D 比例

          就像rotate您可以在 3D 中縮放一樣。為此,您將使用與 and 類似的函數scaleZ,但用于 Z 軸。這同樣只對 3D 元素有用。scaleX``scaleY

          translate

          可能我最喜歡的轉換元素的方法是使用translate函數。這個函數像scale函數一樣接受一個或兩個參數,并將根據提供的值移動一個元素。

          .red {
            transform: translate(25px);
          }
          .green {
            transform: translate(-25px, 25px);
          }
          .blue {
            transform: translate(0, -25px);
          }
          

          透明的彩色箭頭表示形狀通常放置的位置,而不透明的箭頭表示它們在平移后的位置。

          你會注意到,當只有一個值被傳遞給它時,translate它只會影響 X 軸,因此元素向右移動 25 個像素,因為它是一個正值。

          當將兩個值傳遞給translate第一個值時,會在 X 軸上移動元素,而第二個值會影響 Y 軸的位置。這意味著綠色箭頭向左移動 25 個像素,向下移動 25 個像素。正 Y 值將元素向下移動似乎令人困惑,因為我們通常認為正 Y 意味著向上,但在 Web 開發(fā)中,正 Y 值意味著元素在頁面中向下移動。

          最后,藍色箭頭向上移動了 25 個像素,因為第一個參數設置為 0,第二個參數設置為負 25 個像素。

          就像 scale 一樣,有一個translateXtranslateY函數可以一次只在一個方向上移動一個元素。

          百分比translate

          translate屬性處理百分比的方式與幾乎所有其他 CSS 屬性不同,因為它基于元素的大小而不是其父級的大小。

          .red {
            transform: translate(100%);
          }
          

          正如你所看到的,當我們用百分比平移時,我們將元素向右移動了其自身寬度的 100%。這對于通過將元素移動其自身寬度的 50% 或將元素彼此偏移其大小的百分比來使元素居中非常有用。

          3D translate

          您現在可能已經猜到了,但translate也可以在 3D 中使用。您可以使用translateZ僅修改 Z 軸的函數或translate3D類似 的函數translate,但接受第三個參數來在 Z 軸上移動元素。同樣,這僅對 3D 元素有用。

          偏斜

          可能所有transform功能中最沒用的是skew. 它允許您通過傾斜形狀的邊緣來拉伸形狀。該skew函數接受一兩個參數,就像translate.

          .red {
            transform: skew(25deg);
          }
          .green {
            transform: skew(15deg, 25deg);
          }
          .blue {
            transform: skew(-15deg, -25deg);
          }
          

          如您所見,skew 屬性在 X 和 Y 方向上拉伸了我們的形狀。通過指定一個參數,我們只在 X 方向上傾斜,而如果我們傳遞兩個屬性,第一個在 X 方向上傾斜,第二個在 Y 方向上傾斜。

          此外,就像translate您可以使用skewXskewY在一個方向上傾斜元素而不影響其他方向一樣。

          3D 傾斜

          不同的是,所有其他transform屬性skew都沒有任何 3D 版本。

          組合變換

          到目前為止,我們已經討論了單獨使用轉換,但是如果您想使用多個轉換怎么辦?這實際上非常簡單,因為您可以傳遞任意數量的函數transform

          .red {
            transform: rotate(25deg) scale(.5) translateX(50px);
          }
          .green {
            transform: rotate(-.5turn) translateX(-10%);
          }
          .blue {
            transform: scaleX(1.2) scaleY(.8);
          }
          

          組合轉換變得困難的唯一時候是當您想要在不同的類中修改它們時。

          .base-class {
            transform: scale(1.2) translateX(5px);
          }
          .big {
            transform: scale(2) translateX(5px);
          }
          .move {
            transform: scale(1.2) translateX(100px);
          }
          .big.move {
            transform: scale(2) translateX(100px);
          }
          

          由于transform是一個屬性,您需要在修改的每個類之間復制所有值,transform因為如果您只是transform: scale(2).big類中寫入,它將覆蓋整個transform而不只是scale部分。幸運的是,我們可以巧妙地使用 CSS 變量來解決這個問題。

          .base-class {
            transform: scale(var(--scale, 1.2)) translateX(var(--translate-x, 5px));
          }
          .big {
            --scale: 2;
          }
          .move {
            --translate-x: 100px;
          }
          

          如您所見,我們現在只更改 CSS 變量,而從未修改實際transform屬性。

          結論

          總體而言,CSStransform非常有用,同時也非常易于理解。到目前為止,最難的部分transform是理解如何跨不同類組合多個變換,但在 CSS 變量的幫助下,這個問題是微不足道的。

          旋轉 div 元素:

          div

          {

          transform:rotate(7deg);

          -ms-transform:rotate(7deg); /* IE 9 */

          -webkit-transform:rotate(7deg); /* Safari and Chrome */

          }


          瀏覽器支持

          表格中的數字表示支持該屬性的第一個瀏覽器版本號。

          緊跟在 -webkit-, -ms- 或 -moz- 前的數字為支持該前綴屬性的第一個瀏覽器版本號。

          屬性
          transform (2D)36.04.0 -webkit-10.09.0 -ms-16.03.5 -moz-9.03.2 -webkit-23.015.0 -webkit-10.5 -o-
          transform (3D)36.012.0 -webkit-12.010.016.010.0 -moz-9.04.0 -webkit-

          屬性定義及使用說明

          Transform屬性應用于元素的2D或3D轉換。這個屬性允許你將元素旋轉,縮放,移動,傾斜等。

          為了更好地理解Transform屬性,請查看 在線實例.

          默認值:none
          繼承:no
          版本:CSS3
          JavaScript 語法:object.style.transform="rotate(7deg)"

          語法

          transform: none|transform-functions;

          描述
          none定義不進行轉換。
          matrix(n,n,n,n,n,n)定義 2D 轉換,使用六個值的矩陣。
          matrix3d(n,n,n,n,n,n,n,n,n,n,n,n,n,n,n,n)定義 3D 轉換,使用 16 個值的 4x4 矩陣。
          translate(x,y)定義 2D 轉換。
          translate3d(x,y,z)定義 3D 轉換。
          translateX(x)定義轉換,只是用 X 軸的值。
          translateY(y)定義轉換,只是用 Y 軸的值。
          translateZ(z)定義 3D 轉換,只是用 Z 軸的值。
          scale(x[,y]?)定義 2D 縮放轉換。
          scale3d(x,y,z)定義 3D 縮放轉換。
          scaleX(x)通過設置 X 軸的值來定義縮放轉換。
          scaleY(y)通過設置 Y 軸的值來定義縮放轉換。
          scaleZ(z)通過設置 Z 軸的值來定義 3D 縮放轉換。
          rotate(angle)定義 2D 旋轉,在參數中規(guī)定角度。
          rotate3d(x,y,z,angle)定義 3D 旋轉。
          rotateX(angle)定義沿著 X 軸的 3D 旋轉。測試
          rotateY(angle)定義沿著 Y 軸的 3D 旋轉。
          rotateZ(angle)定義沿著 Z 軸的 3D 旋轉。
          skew(x-angle,y-angle)定義沿著 X 和 Y 軸的 2D 傾斜轉換。
          skewX(angle)定義沿著 X 軸的 2D 傾斜轉換。
          skewY(angle)定義沿著 Y 軸的 2D 傾斜轉換。
          perspective(n)為 3D 轉換元素定義透視視圖。

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!


          主站蜘蛛池模板: 日本福利一区二区| 久久婷婷色综合一区二区| 动漫精品一区二区三区3d| 久久精品亚洲一区二区三区浴池| 日韩在线视频一区二区三区| 中文字幕精品无码一区二区三区| 日本精品无码一区二区三区久久久| 国产成人无码一区二区在线观看| 精品不卡一区中文字幕| 精品国产一区二区三区免费看 | 国产午夜精品一区二区三区嫩草 | 久久久国产精品无码一区二区三区| 日本一区二区在线免费观看| 亚洲欧美日韩中文字幕一区二区三区| 国产一区二区女内射| 人妻少妇精品一区二区三区| 亚洲AV永久无码精品一区二区国产 | 国产MD视频一区二区三区| 波多野结衣久久一区二区| 日韩人妻一区二区三区蜜桃视频| 亚洲乱码日产一区三区| 日产一区日产2区| 亚洲熟妇av一区二区三区| 久久99精品免费一区二区| 夜夜精品无码一区二区三区| 无码人妻一区二区三区免费视频 | 久久国产精品亚洲一区二区| 国模吧一区二区三区| 国偷自产av一区二区三区| 国产高清不卡一区二区| 91福利一区二区| 99精品国产一区二区三区2021 | 红杏亚洲影院一区二区三区| 亚洲成av人片一区二区三区| 国产激情一区二区三区在线观看| 国产AV天堂无码一区二区三区| 无码国产亚洲日韩国精品视频一区二区三区 | 中字幕一区二区三区乱码 | 免费无码毛片一区二区APP| 久久久无码精品国产一区| 久久久无码精品国产一区 |