transform 2D(變換)

 

transform是CSS3中所提供的變換特效

<!DOCTYPE html>
<html>
<head>
<style> 
div {
    width: 200px;
    height: 100px;
    background-color: yellow;
    /* Rotate div */
    -ms-transform: rotate(7deg); /* IE 9 */
    -webkit-transform: rotate(7deg); /* Chrome, Safari, Opera */
    transform: rotate(7deg);
}
</style>
</head>
<body>

<div>Hello</div>
<br>

<p><b>Note:</b> Internet Explorer 8 and earlier versions do not support the transform property.</p>

<p><b>Note:</b> Internet Explorer 9 supports an alternative, the -ms-transform property. Newer versions of IE support the transform property (do not need the ms prefix).</p>

<p><b>Note:</b> Chrome, Safari and Opera supports an alternative, the -webkit-transform property.</p>

</body>
</html>

 

prefix前輟詞:

prefix前輟詞或叫廠商辨識詞 (vendor identifier) ,

瀏覽器廠商為了搶先支援 W3C未正式發佈的規範或更好的瀏覽器相容性,也會先以擴充特性來處理。

例如:

-ms-transform

-webkit-transform

-moz-transform

-o-transform

 

一、2D Transform 屬性

1、translate 位移

<!DOCTYPE html>
<html>
<head>
    <style>
        div {
            width: 100px;
            height: 75px;
            background-color: red;
            border: 1px solid black;
        }

            div#div2 {
                -ms-transform: translate(50px,100px); /* IE 9 */
                -webkit-transform: translate(50px,100px); /* Chrome, Safari, Opera */
                transform: translate(50px,100px); /* Standard syntax */
            }
    </style>
</head>
<body>

    <div>Hello. This is a DIV element.</div>

    <div id="div2">Hello. This is a DIV element.</div>

</body>
</html>

JS Bin

此動作為div2向右偏移50px,並向下偏移100px,

該功能就是對指定的元素做偏移動作,功能跟left、right、top、bottom一樣,

但使用translate的效能會比較好,參考jsFiddle Demo for mobile devices

 

translate 有個特別的地方,就是可以使用百分比,

例如:

a、

transform: translateX(100%);

即表示X軸水平位移多少則是根據元素本身的 width * 100% 來決定的,

當 width : 100px 時,則X軸水平位移100px。

b、

transform: translateY(40%);

即表示Y軸垂直位移多少則是根據元素本身的 height * 40% 來決定的,

當 height : 75px 時,則Y軸垂直位移30px。

 

而 transform: translate(value_1 , value_2); 則同時具有

translateX(value_1) 與 translateY(value_2) 功能。

例如:

transform: translate(100%,100%);

<!DOCTYPE html>
<html>
<head>
    <style>
        div {
            width: 100px;
            height: 75px;
            background-color: red;
            border: 1px solid black;
            position: absolute;
        }
        .translate {
            transform: translate(100%,100%); /* Standard syntax */
        }
    </style>
</head>
<body>
    <div>Hello. This is a DIV element.</div>
    <div class="translate">Hello. This is a DIV element.</div>
</body>
</html>

 

2、rotate 旋轉

<!DOCTYPE html>
<html>
<head>
<style> 
div {
    width: 100px;
    height: 75px;
    background-color: red;
    border: 1px solid black;
}

div#div2 {
    -ms-transform: rotate(30deg); /* IE 9 */
    -webkit-transform: rotate(30deg); /* Chrome, Safari, Opera */
    transform: rotate(30deg); /* Standard syntax */
}
</style>
</head>
<body>

<div>Hello. This is a DIV element.</div>

<div id="div2">Hello. This is a DIV element.</div>

</body>
</html>

JS Bin

該功能就是對指定的元素做旋轉動作,可做順時鐘或逆時鐘平面旋轉。

另外要注意的是,如果想要對行內元素使用旋轉特效,

則要先對行內元素的display屬性使用inline-bolck或block,

使其有自已的寬度,才能成功做出旋轉特效。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width">
    <title>Brooke Shieh</title>

    <style>
        .year {
            display: inline-block;
            transition: all 0.5s ease-in-out;
        }

            .year:hover {
                transform: rotate(-180deg);
            }

        i {
            /*display: inline-block;*/
            transition: all 0.5s ease-in-out;
        }

            i:hover {
                transform: rotate(-180deg);
            }
    </style>
</head>
<body>
    <div class="example-date">
        <span class="day">31</span>
        <span class="month">July</span>
        <span class="year">2009</span>
        <i>aaa</i>
    </div>
</body>
</html>

 

3、scale 縮放

<!DOCTYPE html>
<html>
<head>
    <style>
        div {
            width: 100px;
            height: 75px;
            background-color: red;
            border: 1px solid black;
        }

            div#div2 {
                margin: 100px;
                -ms-transform: scale(2,4); /* IE 9 */
                -webkit-transform: scale(2,4); /* Chrome, Safari, Opera */
                transform: scale(2,4); /* Standard syntax */
            }
    </style>
</head>
<body>

    <div>Hello. This is a DIV element.</div>

    <div id="div2">Hello. This is a DIV element.</div>

</body>
</html>

JS Bin

該功能就是對指定的元素做原點縮放動作,可個別做水平或垂直N倍縮放動作。

 

也可以個別對X軸或Y軸做處理如:

transform: scaleX(n);、transform: scaleY(n);

 

4、skew()

<!DOCTYPE html>
<html>
<head>
    <style>
        div {
            width: 100px;
            height: 75px;
            background-color: red;
            border: 1px solid black;
            margin: 100px;
        }

            div#div2 {
                -ms-transform: skew(60deg,60deg); /* IE 9 */
                -webkit-transform: skew(60deg,60deg); /* Chrome, Safari, Opera */
                transform: skew(60deg,60deg); /* Standard syntax */
            }
    </style>
</head>
<body>
    <div id="div2">Hello. This is a DIV element.</div>

</body>
</html>

JS Bin on jsbin.com

該功能就是對指定的元素使之向X軸或向Y軸做傾斜動作,參考以下示意圖

 

也可以個別對X軸或Y軸做處理如:

transform: skewX(deg);、transform: skewY(deg);

 

5、matrix()

JS Bin

transform也提供矩陣來實作偏移、旋轉、縮放、扭曲動作,只是一般開發者不太會經由這方式來實作。

P.S. 如果你有學過線性代數的話,那你就會操作他了。

 

6、transform-origin

transform-origin 是用來跟 transform: rotate(deg) 屬性配合,

其功能用來設定旋轉的中心點,其數值可為百分比、名稱、長度。

例如:

transform-origin: 50% 50%;就是一個block的中心點,並且是transform-origin的預設值,

也可以寫為transform-origin: center center;,

transform-origin: 0% 0%;就是等於transform-origin: left top;,

transform-origin: 100% 100%;就是等於transform-origin: right bottom;。

範例如下:

<!DOCTYPE html>
<html>
<head>
    <style>
        .parent {
            height: 200px;
            width: 200px;
            margin: 100px;
            border: 1px solid black;
        }
        .child {
            height: 100px;
            width: 100px;
            border: 1px solid black;
            background-color: red;
        }
        .corner {
            border-radius: 10px;
            background: #73AD21;
            width: 10px;
            height: 10px;
        }
        @keyframes rotate_45 {
            100% {
                transform: rotate(45deg);
            }
        }
        /*ex-1*/
        #ex-1 {
            transform-origin: 0 0;
            animation-name: rotate_45;
            animation-duration: 5s;
            animation-iteration-count: 3;
        }
        #corner-1 {
            margin: calc(0 - 10px / 2) 0 0 calc(0 - 10px / 2);
        }
        /*ex-2*/
        #ex-2 {
            transform-origin: 50% 50%;
            animation-name: rotate_45;
            animation-duration: 5s;
            animation-iteration-count: 3;
        }
        #corner-2 {
            margin: calc(50px - 10px / 2) 0 0 calc(50px - 10px / 2);
        }
        /*ex-3*/
        #ex-3 {
            transform-origin: 100% 100%;
            animation-name: rotate_45;
            animation-duration: 5s;
            animation-iteration-count: 3;
        }
        #corner-3 {
            margin: calc(100px - 10px / 2) 0 0 calc(100px - 10px / 2);
        }
    </style>
</head>
<body>
    <div class="parent">
        <div id="ex-1" class="child">
            <div id="corner-1" class="corner"></div>
        </div>
    </div>
    <div class="parent">
        <div id="ex-2" class="child">
            <div id="corner-2" class="corner"></div>
        </div>
    </div>
    <div class="parent">
        <div id="ex-3" class="child">
            <div id="corner-3" class="corner"></div>
        </div>
    </div>

</body>
</html>

 

參考資料:

你需要知道的CSS3動畫技術 - 2

transform 3D(變換)