CSS3 transform屬性


在介紹有關transform相關的知識之前,先來講一下transform-origin的用法以及關於<angle>角度的幾種取值單位。另外,在使用時,為了兼容各個瀏覽器,可加上瀏覽器的私有前綴[-moz- -webkit -ms-]。

transform-origin

設置對象變換的原點,通常和rotate旋轉、scale縮放、skew斜切等一起使用,IE9+

2D情況下:默認值 50% 50%,即center center

3D情況下:默認值 50% 50% 0

取值介紹:

  1. X軸:left|center|right|length|%
  2. Y軸:top|center|bottom|length|%
  3. Z軸:length

注意:如果只設置一個值,則該值作用於橫坐標,縱坐標默認50%,Z軸默認為0,另外百分比是相對於自身進行計算的。

如:

{
  transform: rotate(45deg);
  transform-origin: 0 0;
  -ms-transform: rotate(45deg);     /* IE 9 */
  -ms-transform-origin: 0 0;          
  -moz-transform: rotate(45deg);    /* Firefox */
  -moz-transform-origin: 0 0; 
  -webkit-transform: rotate(45deg); /* Safari Opera and Chrome */ 
  -webkit-transform-origin: 0 0;
}

 

效果圖:

角度的單位

CSS3新增,角度單位有四種,在所有可使用角度的地方均可使用這四種單位,但是需要注意兼容性,除turn單位外其他單位均可兼容IE9+瀏覽器版本。

單位說明:

90deg = 100grad = 0.25turn ≈ 1.570796326794897rad

單位說明
deg度數,一個圓共360度,IE9+
grad梯度,一個圓共400梯度,IE9+
rad弧度,一個圓共2n弧度,IE9+
turn轉、圈,一個圓共1轉,IE+ FireFox13.0+

transform

變換,可對元素進行位移、旋轉、縮放、傾斜操作,支持2D或者3D轉換,IE9+支持。

目錄

  • translate 位移
  • rotate 旋轉
  • scale 縮放
  • skew 斜切
  • 變換綜合應用

translate 位移

對象進行2D空間或3D空間的位移。 使用規則:

translate(): 第一個參數指定X軸的位移量[必須], 第二個參數指定Y軸的位移量[當不設置時, 默認為0];
translateX(): 指定X軸的位移;
translateY(): 指定Y軸的位移;
translate3D(): 第一個參數指定X軸的位移量, 第二個參數指定Y軸的位移量, 第三個參數指定Z軸的位移量, 3個參數缺一不可;
translateZ(): 指定Z軸的位移;

 

使用translate時需要注意位移量的百分比是相對元素自身寬高來計算的。

translate有一個最常見的應用,即當元素寬度高度不固定時,使用translate可實現水平以及垂直方向的居中。

代碼示例:

    dom結構
 <div class="box">
        <div class="item">center</div>
    </div>
 樣式設計
 .box{
        position: relative;
        width: 300px;
        height: 300px;
        border: 1px solid;
    }
    .item{
        position: absolute;
        padding: 50px;
        background-color: #fb3;
        top: 50%; /*相對於父級*/
        left: 50%;

        transform: translate(-50%, -50%); /*相對自身*/

        -ms-transform: translate(-50%, -50%); 
        -moz-transform: translate(-50%, -50%); 
        -webkit-transform: translate(-50%, -50%); 
    }

 

效果圖:

rotate 旋轉

對象進行2D空間或3D空間旋轉。常與 transform-origin 一起使用。

使用規則:

rotate(): 2D旋轉,根據指定的旋轉角度進行旋轉;
rotate3D(): 3D旋轉,必須指定四個參數,前3個參數分別表示旋轉的方向x y z, 第4個參數表示旋轉的角度;
rotateX(): 指定X軸的旋轉角度;
rotateY(): 指定Y軸的旋轉角度;
rotateZ(): 指定Z軸的旋轉角度;

 

使用rotate時需要注意以下幾點:

  1. 旋轉角度必須有單位,否則將報錯。
  2. rotate值為正值時,順時針旋轉;否則逆時針旋轉。
  3. 在2D情況下,rotate()只能指定一個參數;在3D情況下,rotate3D()必須指定四個參數,否則將報錯。

旋轉45度,代碼示例:

 /* X軸旋轉45度 */
    .item1{
        transform: rotateX(-45deg);

        -moz-transform: rotateX(-45deg);
        -ms-transform: rotateX(-45deg);
        -webkit-transform: rotateX(-45deg);
    }

    /* Y軸旋轉45度 */
    .item2{
        transform: rotateY(-45deg);

        -moz-transform: rotateY(-45deg);
        -ms-transform: rotateY(-45deg);
        -webkit-transform: rotateY(-45deg);
    }

    /* Z軸旋轉45度 */    
    .item3{
        transform: rotateZ(-45deg);

        -moz-transform: rotateZ(-45deg);
        -ms-transform: rotateZ(-45deg);
        -webkit-transform: rotateZ(-45deg);
    }

 

示例圖:

上述例子中的 rotateZ(-45deg);也可以寫成 rotate3D(0,0,1,-45deg);,當然相對於X軸、Y軸的也可使用rotate3d的簡寫形式。

另外,不難看出只指定Z軸的旋轉與2D旋轉的效果一致。即以下三種寫法得到的旋轉效果是一樣的:

transform: rotate(-45deg);

transform: rotate3D(0,0,1,-45deg);

transform: rotateZ(-45deg);

 

scale 縮放

對象進行2D空間或3D空間縮放。常與 transform-origin 一起使用。

使用規則:

scale(): 第一個參數指定X軸的縮放倍數[必須], 第二個參數指定Y軸的縮放倍數[當不設置時, 默認取第一個參數的值];;
scaleX(): 指定X軸的縮放倍數;
scaleY(): 指定Y軸的縮放倍數;
scale3D(): 第一個參數指定X軸的縮放倍數, 第二個參數指定Y軸的縮放倍數, 第三個參數指定Z軸的縮放倍數, 3個參數缺一不可;
scaleZ(): 指定Z軸的縮放倍數;

 

使用scale時需要注意以下幾點:

  1. 參數值為倍數,如:scale(2); 表示放大2倍。
  2. 參數值是分別相對元素的寬和高進行計算的。即便是scale只設置了一個值,那也是分別計算的。
  3. 參數值大於1表示放大;0~1之間為縮小;1表示不便;0的時候元素不可見。
  4. 參數值為負數時,除了元素的方向發生改變[x軸反轉],其他規律與正值一致。

負值的情況,代碼示例:

    dom結構
 <div class="box">
        <div class="item">Item</div>
    </div>

 

 樣式設計
 .box{
        width: 300px;
        height: 300px;
        border: 1px solid;
    }
    .item{
        width: 100px;
        height: 100px;
        line-height: 100px;
        text-align: center;
        background-color: #fb3;

        transform: scale(-1.2);

        -ms-transform: scale(-1.2);
        -moz-transform: scale(-1.2);
        -webkit-transform: scale(-1.2);
    }

 

效果圖:

圖中可看出,元素相對於x軸發生了反轉,但是縮放效果並沒有受影響。

skew 斜切

對象進行2D空間斜切。常與 transform-origin 一起使用。

使用規則:

skew(): 第一個參數對應X軸[必須], 第二個參數對應Y軸[當不設置時, 默認為0];; skewX(): 指定X軸的斜切; skewY(): 指定Y軸的斜切; 

綜合應用

  • 平行四邊形
  • 梯形
  • 菱形
  • 折角

平行四邊形

原理:使用skew斜切來實現。

先看效果圖:

看到效果圖,最先想到的是對元素使用skew斜切效果。

簡單使用斜切代碼:

    dom結構:
<div class="btn">Home</div>

 

 樣式設計:
.btn{
        width: 150px;
        height: 40px;
        text-align: center;
        line-height: 40px;
        background-color: #fb3;

        transform: skew(-45deg);

        -moz-transform: skew(-45deg);
        -ms-transform: skew(-45deg);
        -webkit-transform: skew(-45deg);
    }

 

確實實現了平行四邊形的效果,但是里面的內容也被斜切了,並不完美。

下面介紹兩種方向來實現平行四邊形,且內容不會受影響。

第一種是比較常見的,嵌套一層結構,父元素進行斜切,子元素抵消掉斜切。

代碼:

    dom結構:
  <div class=".box">
        <div class="btn">home</div> 
    </div>

 

 樣式設計:
.box{
        width: 150px;
        height: 40px;
        text-align: center;
        line-height: 40px;
        background-color: #fb3;

        transform: skew(-45deg);

        -moz-transform: skew(-45deg);
        -ms-transform: skew(-45deg);
        -webkit-transform: skew(-45deg);
    }
    .btn{
        transform: skew(45deg);

        -moz-transform: skew(45deg);
        -ms-transform: skew(45deg);
        -webkit-transform: skew(45deg); 
    }

 

第二種方法是使用偽元素,將斜切背景應用在偽元素上。

代碼:

    dom結構:
<div class="btn">home</div> 

 

 樣式設計:
 .btn{
        position: relative;
        width: 150px;
        height: 40px;
        text-align: center;
        line-height: 40px;
    }
    .btn:after{
        position:absolute;
        content: '';
        width: 100%;
        height: 100%;
        top: 0;
        left: 0;
        background-color: #fb3;

        z-index: -1; /* 保證背景不會覆蓋住文字 */

        transform: skew(-45deg);

        -moz-transform: skew(-45deg);
        -ms-transform: skew(-45deg);
        -webkit-transform: skew(-45deg); 
    }

 

梯形

梯形的實現相對平行四邊形來說要復雜一些,需要借助perspective()透視來實現。

先看效果圖:

代碼:

    dom結構:
<div class="box">home</div>

 

 基本樣式
.box {
        position: relative;
        width: 200px;
        height: 60px;
        margin: 50px;
        line-height: 60px;
        text-align: center;
    }

 

下面來說明一下如何實現梯形效果:

和平行四邊形的原理一樣,梯形的背景仍要寫在偽元素上,以防止字體變形。

代碼如下:

 .box:after {
        position: absolute;
        content: '';
        top: 0;
        left: 0;
        right: 0;
        bottom: 0;
        z-index: -1;
        background-color: #fb3;
        transform: perspective(20px) rotatex(5deg);

        -moz-transform: perspective(20px) rotatex(5deg);
        -ms-transform: perspective(20px) rotatex(5deg);
        -webkit-transform: perspective(20px) rotatex(5deg);
    }  

 

為更好的查看效果,可以給box加上半透明的背景,效果圖:

旋轉是以元素的中心線進行旋轉的,所以要修改一下旋轉原點,增加以下代碼:

 transform-origin: bottom;
    -moz-transform-origin: bottom;
    -ms-transform-origin: bottom;
    -webkit-transform-origin: bottom;

 

在看效果圖:

這時可以發現,元素的高度已經嚴重縮水了,這時候可以使用scale進行y軸的縮放,修改transform代碼如下:

    transform: perspective(20px) rotatex(5deg) scaley(1.3); -moz-transform-origin: perspective(20px) rotatex(5deg) scaley(1.3); -ms-transform-origin: perspective(20px) rotatex(5deg) scaley(1.3); -webkit-transform-origin: perspective(20px) rotatex(5deg) scaley(1.3); 

效果:

當然也可以利用修改transform-origin的值實現不同的梯形。

代碼如下[別忘記兼容性,加上瀏覽器前綴]:

    右側直角
    transform-origin: right;
 transform: perspective(20px) rotatex(5deg); 左側直角 transform-origin: left;  transform: perspective(20px) rotatex(5deg); 

菱形

菱形的實現有兩種,第一種是有rotate結合scale實現,第二種是用clip-path實現。

首先對父級進行旋轉 代碼:

    dom結構
    <div class="box"> <img src=""> </div> 基本樣式設計:
 .box{
        width: 200px;
        height: 200px;
        border: 1px solid;
        overflow: hidden;

        transform: rotate(45deg);
        -mos-transform: rotate(45deg);
        -mz-transform: rotate(45deg);
        -webkit-transform: rotate(45deg);
    }
    .box img{
        width: 100%;
    }

 

效果圖:

現在可以加上scale屬性了,更改transform屬性為:

 transform: rotate(-45deg) scale(1.41); 

但是這個方法有限制,每次必須要計算scale放大的比例,並且當圖片不是正方形時,就沒辦法實現較好的菱形效果。

第二種方案,使用clip-path實現。不需要嵌套任何元素。

    clip-path: polygon(0 50%, 50% 0, 100% 50%, 50% 100%); 

效果圖:

折角效果

如果是規則的折角圖案,如下圖所示,可直接用background實現,詳情可見文章背景應用

[代碼就不過多說明了]代碼示例:

    dom結構
    <div class="box"></div> 基本樣式 .box {  width: 200px;  height: 200px; background-color: #58a; /*hack 回退*/  background: linear-gradient(225deg, transparent 20px, rgba(0, 0, 0, .7) 0), linear-gradient(225deg, transparent 20px, yellowgreen 0); background-size: 28px, 100%; background-repeat: no-repeat; background-position: right top, center; } 

不同角度的折角實現:

效果圖:

代碼:

    .box{ position: relative; background-color: #58a; /*hack 回退*/ background: linear-gradient(-150deg, transparent 30px, yellowgreen 0); } .box:before { position: absolute; content: ''; width: 62px; height: 34px; top: 0; right: 0; background: linear-gradient(-30deg, transparent 30px, rgba(0, 0, 0, .7) 0); transform: rotate(-120deg); } 

仍需要借助漸變色實現背景,然后旋轉。

也可以進行更多的優化,如陰影,圓角,效果圖如下:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM