一個炫酷的網頁離不開css的transform、transition、animation三個屬性,之前一直沒有涉及到這塊內容,剛好最近要做一個相關東西,趁此機會好好學一學這三個屬性。
一、功能
實現元素的平移、旋轉、縮放或傾斜。
二、 實現條件
只能轉換由盒模型定位的元素。
三、 基本語法
-
transform: none
不應用任何變換 -
transform: <transform-function>
應用一個或多個<transform-function>值,以空格分開<transform-function>是啥? 它是css中的一種資料型別,用於對元素的顯示做變換。包括二維變換和三維變換。
四、 實現方式
1. 變形原點
在介紹轉換之前需要先介紹一下變形原點,即轉換的基點。
(1) 語法
- transform-origin:初始值為(50%, 50%, 0),即center。其屬性值有:
-
一個值:
必須是<length>, <percentage>, 或 left, center, right, top, bottom關鍵字中的一個。如果是<length>, <percentage>則表示x-offset,如果是keyword則表示其應有的意思。(即left、right是橫向的,top、bottom是縱向的,center是中間的) -
兩個值:
- 一個值是<length>, <percentage>, 或 left, center, right關鍵字中的一個。表示距離和模型左側的偏移值(即x-offset或x-offset-keyword)
- 另一個值是<length>, <percentage>, 或 top, center, bottom關鍵字中的一個。表示距離和模型頂部的偏移值(即y-offset或y-offset-keyword)
- 如果第一個值是<length>, <percentage>, left, right,則表示x軸的偏移,另一個值必須是y-offset或y-offset-keyword(top、bottom)。
- 如果第一個值是top,bottom,則表示y軸的偏移,另一個值可以是<length>, <percentage>或 left, right表示x軸的偏移。
- 如果第二個值是left或right,則第二個值表示x軸的,那麼第一個值可以是
, <percentage>或 top, bottom表示y軸的偏移。
(聽起來好繞hhh,但其實不復雜,意思就是兩個值對於x,y的順序沒有規定死,可以自定義,一個表示x軸,那另一個值必須得用y軸的。但如果倆都是值的話,那第一個是x,第二個是y)
-
三個值:
- 前兩個值同只有兩個值時的用法相同。
- 第三個值必須得是<length>。表示Z軸偏移量。
-
PS:keyword與value的值對應關係如下:
- left —— 0%
- center —— 50%
- right —— 100%
- top —— 0%
- bottom —— 100%
-
(2) 示例
2. 平移
(1) 語法
- 二維:translate(tx, ty)
引數:- tx: 要移動向量的橫座標。
- ty: 要移動向量的縱座標。可以不寫,預設為0。
- 三維:translate3d(tx, ty, tz)
引數:- tx: 移動向量的橫座標。
- ty: 移動向量的縱座標。
- tz: 移動向量的z軸座標。不能使用百分比,否則會被認為無效屬性!
- translateX(t)、translateY(t)、translateZ(t)
不用多說了,分別是translate(tx, 0)、translate(0, ty)、translate3d(0, 0, tz)的簡寫形式。
(2) 示例
<div class="transform-div"></div>
.transform-div {
width: 200px;
height: 200px;
background-color: orange;
transform: translate(300px, 10%);
}
3. 旋轉
(1) 語法
-
二維: rotate(a)
- 引數:表示旋轉的角度。正角表示順時針旋轉,負角表示逆時針旋轉。
-
三維: rotate3d(x, y, z, a)
- 效果:3D旋轉,繞著固定軸旋轉。旋轉軸由[x,y,z]向量定義,且過原點(由transform-origin定義)。[x,y,z]向量需要標準化,即三個座標平方和為1,但如果沒有標準化也沒事,因為它在內部會被標準化,但對於不能被標準化的向量,如空向量,會導致旋轉不被應用,但不會影響整個CSS屬性。
- 引數:
- x、y、z: 顧名思義,分別是旋轉向量的x、y、z座標,都為<number>
- a: 旋轉角度。正值表示順時針,負值表示逆時針。
-
rotateX(a), rotateY(a), rotateZ(a):分別是
rotate3D(1, 0, 0, a)
,rotate3D(0, 1, 0, a)
,rotate3D(0, 0, 1, a)
的簡寫。
(2) 示例
<div class="container">
<div class="line1"></div>
<div class="line2"></div>
<div class="transform-div"></div>
</div>
.container {
width: 400px;
height: 400px;
border: 4px solid;
position: relative;
}
.transform-div {
position: absolute;
top: 50%;
left: 50%;
margin-top: -100px;
margin-left: -100px;
width: 200px;
height: 200px;
background-color: orange;
transition: all 1s;
transform: none;
opacity: 0.7;
}
.transform-div:hover {
transform: rotateY(-45deg);
}
.line1 {
position: absolute;
width: 100%;
height: 50%;
border-bottom: 2px solid;
}
.line2 {
position: absolute;
top: 0;
height: 100%;
width: 50%;
border-right: 2px solid;
}
(截圖看到的效果不是很清晰,可以複製上述程式碼看一下旋轉效果)
4. 縮放
(1) 語法
-
二維: scale(sx) 或 scale(sx, sy)
- 效果:分別在x方向和在y方向放大or縮小一定的倍數,不同方向上的放大/縮小倍數可以不同。
- 引數:
- sx:縮放向量的橫座標,為<number>值。
- sy:縮放向量的縱座標,為<number>值。可以不存在,若不存在,則預設值與sx相同,即元素均勻縮放。
- 值的大小在[-1,1]時,元素為縮放;大小在[-1,1]範圍外時,為放大元素;當等於1時,什麼都不做;當為負值時,執行點反射和大小修改。
-
三維: scale3d(sx, sy, sz)
- 引數:分別表示在橫軸、縱軸、z軸的縮放大小。
5. 傾斜
(1) 語法
- skew(ax) 或 skew(ax, ay)
- 引數:ax、ay表示沿橫、縱座標扭曲元素的程度。是一個角度。
- skewX(a)
- 效果:水平拉伸,將元素每個點在水平方向上扭曲一定程度。
- 引數:是一個角度,表示用於沿著橫座標扭曲元素的角度。
- skewY(a)
- 效果:垂直拉伸,將元素每個點在垂直方向上扭曲一定程度。
- 引數:是一個角度,表示用於沿著縱座標扭曲元素的角度。
(2) 示例
【補充】CSS角度單位:deg(度)、grad(梯度)、rad(弧度)、turn(圓、圈)
180deg = 200grad = 0.5turn = Π
6. 複合變換
- 複合變換順序:按從左到右的順序。(這個順序我自己沒有很理解,我試了幾個,只要沒有旋轉,無論順序如何,得到的結果都是一樣的,不懂原理,於是網上查了查,發現了這篇部落格:https://www.cnblogs.com/xljzlw/p/4966798.html 值得參考。在旋轉的時候,座標系也會跟著旋轉,所以旋轉的順序至關重要,如下示例:)
示例:
【解釋】如上圖所示,平移和旋轉的順序不同,得到的結果也不同。根本原因是,旋轉時座標系會跟著旋轉。如下圖:
【ps】只要不涉及旋轉,那麼順序就無所謂,因為座標系不會變。如果涉及到旋轉,就要考慮順序問題了,為了得到自己想要的效果,可以每次都把旋轉放到最後。