1. 程式人生 > 其它 >CSS之transform介紹與動態LOGO的製作

CSS之transform介紹與動態LOGO的製作

目錄

一、CSS transform 屬性的介紹

通過修改CSS視覺格式化模型的座標空間,CSS 的 transform 屬性允許使用者平移,旋轉,縮放或傾斜給定元素。
transform 屬性可以指定為關鍵字值 none 或一至多個<transform-function>(transform 函式)值。

舉例



transform 屬性指定為關鍵字值 none :

transform: none

transform 屬性指定為一至多個<transform-function>(transform 函式)值:

/* transform: <transform-function> */
transform: scale(0.6) translate(-.9em, .2em) rotateX(360deg);

二、transform 函式

在 CSS3 中,transform 函式包括:translate、rotate、scale、skew 與 matrix。

translate ——平移

平移分為 translateX()、translateY()、translateZ(),表示在X、Y、Z軸上移動,也有2D移動的 translate(,) 可以同時指定在 X 與 Y 軸上的移動量,以及3D移動的 translate3d(,,) 可以同時指定在三條軸上的移動量。
移動量一般用長度來指定,如 10px 。也可以通過百分比來指定,其參考值是 transform 作用元素的尺寸。

transform: translate(20px, 30px)

translate 可以用於絕對定位下的元素居中。示例如下:

.wrapper {
    position: absolute;
    top: 50%;
    left: 50%;
    /* 
      此時元素左上角居中,故要將元素向左平移寬度的一半、向上平移高度的一半,才能使元素的中心居中;
      由於座標系中,原點右側為 X 軸正軸,原點下方為 Y 軸正軸,故此處取負值
    */
    transform: translate(-50%, -50%);
}

rotate ——旋轉

rotate()為 2D 旋轉,其引數值為角度,如 45deg ,預設為順時針旋轉,若角度取負數則反向旋轉。
3D 旋轉分為按 X、Y、Z 軸旋轉,對應的函式即 rotateX()、rotateY()與rotateZ()。

transform: rotateX(45deg)

scale ——縮放

scale的引數值 n 為縮放的比例,n 為正數表示放大 n 被,n 為負數表示縮小至 |n| 倍,基數為 1 。
scale()定義 2D 縮放,scale3d(x,y,z)定義 3D 縮放。scaleX()、scaleY()、scaleZ()分別表示單獨在 X、Y、Z 軸上縮放當前元素。

transform: scale(2.0)

skew ——傾斜

skew(,)為 2D 旋轉,其引數值為角度,如 30deg 。
3D 旋轉分為按 X、Y 軸旋轉,對應的函式即skewX()與skewY()。

transform: skewX(-30deg)

效果圖

實現過程

外部wrapper(站牌的邊框)居中顯示。

.wrapper {
    background-color: rgb(155, 27, 27);
    background-clip: content-box;
    border: 30px double white;
    cursor: pointer;
    padding: 1%;
    /* 使用flex佈局,操縱其子元素居中 */
    display: flex;
    justify-content: center;
    align-items: center;
    /* 該元素居中 */
    position: absolute;
    top: 50%;
    left: 50%;
    transform: translate3d(-50%, -50%, 0);
}

wrapper(站牌)內有 5 個 strong 標籤,從左到右依次包裝了 9 3 / 4 Station 這個五個單詞。

.wrapper strong {
    /* strong為行級元素,需要更改為塊級元素,否則無動畫效果 */
    display: inline-block;
    margin: .2em;
    font-size: 3em;
    color: whitesmoke;
    /* 因為後續要對這 5 個 strong 標籤(即站牌上的文字)進行 transform,故此處新增 transition ,即過渡時間,讓元素轉變形態的過程能展現出來 */
    transition: 1s;
}

當滑鼠移過外層 wrapper(站牌)時,這 5 個單詞將發生變化。

.wrapper:hover strong:nth-of-type(1) {
    /* 9 放大至 1.4 倍,並向右移動,靠近 3 / 4 */
    transform: scale(1.4) translateX(.6em);
}
.wrapper:hover strong:nth-of-type(2) {
    /* 3 縮小並向右上方移動,移動至 / 之上,成為分子 */
    transform: scale(0.6) translate(.9em, -.6em);
}
.wrapper:hover strong:nth-of-type(3) {
    /* / 縮小並在 Y 軸上適當移動 */
    transform: scale(0.8) translateY(-.2em);
}
.wrapper:hover strong:nth-of-type(4) {
    /* 4 縮小並向左下方移動,移動至 / 之下,成為分母 */
    transform: scale(0.6) translate(-.9em, .2em);
}
.wrapper:hover strong:nth-of-type(5) {
    /* Station 繞 X 軸轉動一圈 */
    transform: rotateX(360deg);
}

四、使用 transform 的注意事項

不要忘記原 transform 函式

Q:為某元素 hover 樣式中新增 transform 效果後,原效果消失
A:在為元素的 hover 樣式新增 transform 效果時,不要忘記把原效果加上
例如:

.wrapper {
    transform: translate(-50%, -50%)
}
.wrapper:hover {
    transform: translate(-50%, -50%) scaleX(2)
}

rotate 與 translate 的同時使用

Q:同時使用 rotate 與 translate 後,發現平移的效果與預期不同
A:rotate 在旋轉元素時,會將座標系一起旋轉。以旋轉 90 度為例,旋轉後的 x 軸從原先的水平方向旋轉為垂直方向。
例如:現有三個元素,施加 transform 之前疊加在一起。

.before {
    color: black;
}
.after1 {
    color: darkmagenta;
}
.after2 {
    color: gold;
}



現對三者各新增 transform 函式如下:

/* 元素 color 為黑色 */
.wrapper:hover .before {
    transform: rotate(90deg);
    z-index: -1;
}
/* 元素 color 為深紫紅 */
.wrapper:hover .after1 {
    transform: translateX(100px) rotate(90deg);
}
/* 元素 color 為金色 */
.wrapper:hover .after2 {
    transform: rotate(90deg) translateX(100px);
}



以只旋轉未平移的黑色元素作為參考點,可以觀察到,深紫紅的元素先平移後旋轉,則相比黑色元素確實向左平移了 100px。這說明平移時元素的 x 軸依然是水平方向的。而金色元素雖同樣使用了 translateX(100px) 函式,卻是在垂直方向與參照點黑色相距 100px,水平上處於同一位置。由此可見,由於金色元素的平移發生在旋轉之後,座標系也發生了旋轉,x 軸正軸從原先的水平向右,旋轉了 90 度,變為了垂直向下。故金色元素最終垂直向下偏移了 100px 。
所以,在同時使用 rotate 與 translate 時,應該將 rotate 置於之後,以免產生預期之外的結果。

疊加生效而非覆蓋

應注意,上述提到的 translate、rotate、scale 等本質為函式。在同一個 transform 屬性中同時使用多個相同函式時,會發生疊加效果,而不是後面的覆蓋前面的。
例如:

{ transform: translateX(100px) translateX(-100px); }

則作用的元素最終不會發生任何偏移,因為先向 x 正方向平移了 100px ,又朝負方向平移了 100px ,則最終仍回到原位置。

參考

連結
MDN Web Docs - transform
CSS3 transform 屬性