CSS3 Transform變形理解與應用

CSS3 Transform變形理解與應用

Transform:對元素進行變形;
Transition:對元素某個屬性或多個屬性的變化,進行控制(時間等),相似flash的補間動畫。但只有兩個關鍵貞。開始,結束。
Animation:對元素某個屬性或多個屬性的變化,進行控制(時間等),相似flash的補間動畫。能夠設置多個關鍵貞。
 
Transition與Animation:
transition須要觸發一個事件 ,而animation在不須要觸發任何事件的狀況下也能夠顯式的隨着時間變化來改變元 素css的屬性值,從而達到一種動畫的效果。css

咱們首先學習Transformhtml

transform 2D/3D 轉換屬性向元素應用 2D 或 3D 轉換。該屬性容許咱們對元素進行旋轉、縮放、移動或傾斜。css3

一.CSS3 2D 轉換

經過 CSS3 轉換,咱們可以對元素進行移動、縮放、轉動、拉長或拉伸。web

1.2D Transform轉換屬性

屬性 描述 CSS
transform 向元素應用 2D 或 3D 轉換。 3
transform-origin 容許你改變被轉換元素的位置。 3

2.2D Transform 方法

函數 描述 實例 試一試
轉換      
translateX(n)
translateY(n)
沿着 X 或Y 軸移動元素。    
translate(x,y) 沿着 X 和 Y 軸移動元素。

值 translate(50px,100px) 把元素從左側移動 50 像素,從頂端移動 100 像素。app

div{
transform: translate(50px,100px);
-ms-transform: translate(50px,100px);        /* IE 9 */
-webkit-transform: translate(50px,100px); /* Safari and Chrome */
-o-transform: translate(50px,100px);        /* Opera */
-moz-transform: translate(50px,100px);     /* Firefox */
}ide

試一試
縮放      
scaleX(n)
scaleY(n)
改變元素的寬或高度。    
scale(x,y) 改變元素的寬度和高度。

值 scale(2,4) 把寬度轉換爲原始尺寸的 2 倍,把高度轉換爲原始高度的 4 倍。函數

div{
transform: scale(2,4);
-ms-transform: scale(2,4);    /* IE 9 */
-webkit-transform: scale(2,4);    /* Safari 和 Chrome */
-o-transform: scale(2,4);    /* Opera */
-moz-transform: scale(2,4);    /* Firefox */
}學習

試一試
定義 2D 旋轉      
rotate(angle) 在參數中規定角度。turn是圈,1turn = 360deg;另外還有弧度rad,2πrad = 1turn = 360deg。如,transform:rotate(2turn); //旋轉兩圈

值 rotate(30deg) 把元素順時針旋轉 30 度。動畫

div{
transform: rotate(30deg);
-ms-transform: rotate(30deg);        /* IE 9 */
-webkit-transform: rotate(30deg);    /* Safari and Chrome */
-o-transform: rotate(30deg);        /* Opera */
-moz-transform: rotate(30deg);        /* Firefox */
}url

試一試
傾斜      
skewX(angle)
skewY(angle)
沿着 X 、或Y軸。    
skew(x-angle,y-angle) 沿着 X 和 Y 軸。

值 skew(30deg,20deg) 圍繞 X 軸把元素翻轉 30 度,圍繞 Y 軸翻轉 20 度。

div{
transform: skew(30deg,20deg);
-ms-transform: skew(30deg,20deg);    /* IE 9 */
-webkit-transform: skew(30deg,20deg);    /* Safari and Chrome */
-o-transform: skew(30deg,20deg);    /* Opera */
-moz-transform: skew(30deg,20deg);    /* Firefox */
}

試一試
使用六個值的矩陣。      
matrix(n,n,n,n,n,n) 定義 2D 轉換,使用六個值的矩陣。

matrix() 方法把全部 2D 轉換方法組合在一塊兒。
matrix() 方法須要六個參數,包含數學函數,容許您:旋轉、縮放、移動以及傾斜元素。

使用 matrix 方法將 div 元素旋轉 30 度

div{
transform:matrix(0.866,0.5,-0.5,0.866,0,0);
-ms-transform:matrix(0.866,0.5,-0.5,0.866,0,0);        /* IE 9 */
-moz-transform:matrix(0.866,0.5,-0.5,0.866,0,0);    /* Firefox */
-webkit-transform:matrix(0.866,0.5,-0.5,0.866,0,0);    /* Safari and Chrome */
-o-transform:matrix(0.866,0.5,-0.5,0.866,0,0);        /* Opera */
}

試一試

二.CSS3 3D 轉換

三維變換使用基於二維變換的相同屬性,若是您熟悉二維變換,大家發現3D變形的功能和2D變換的功能至關相似。CSS3中的3D變換主要包括如下幾種功能函數:

3D位移:CSS3中的3D位移主要包括translateZ()和translate3d()兩個功能函數;
3D旋轉:CSS3中的3D旋轉主要包括rotateX()、rotateY()、rotateZ()和rotate3d()四個功能函數;
3D縮放:CSS3中的3D縮放主要包括scaleZ()和scale3d()兩個功能函數;
3D矩陣:CSS3中3D變形中和2D變形同樣也有一個3D矩陣功能函數matrix3d()。

1.3D位移

在CSS3中3D位移主要包括兩種函數translateZ()和translate3d()。translate3d()函數使一個元素在三維空間移動。這種變形的特色是,使用三維向量的座標定義元素在每一個方向移動多少。

隨着px的增長,直觀效果上:

X:從左向右移動

Y:從上向下移動

Z:以方框中心爲原點,變大

x1y1z1

從上圖的效果能夠看出,當z軸值越大時,元素也離觀看者更近,從視覺上元素就變得更大;反之其值越小時,元素也離觀看者更遠,從視覺上元素就變得更小。

例子:

.stage {
    width: 300px;
    height: 300px;
    float: left;
    margin: 15px;
    position: relative;
    background: url(http://www.w3cplus.com/sites/default/files/blogs/2013/1311/bg.jpg) repeat center center;

    -webkit-perspective: 1200px;
    -moz-perspective: 1200px;
    -ms-perspective: 1200px;
    -o-perspective: 1200px;
    perspective: 1200px;
}
.container {
    position: absolute;
    top: 50%;
    left: 50%;

    -webkit-transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    -ms-transform-style: preserve-3d;
    -o-transform-style: preserve-3d;
    transform-style: preserve-3d;
}
.container img {
    position: absolute;
    margin-left: -35px;
    margin-top: -50px; 
}
.container img:nth-child(1){
    z-index: 1;
    opacity: .6;
}
.s1 img:nth-child(2){
    z-index: 2; 
    -webkit-transform: translate3d(30px,30px,200px);
    -moz-transform: translate3d(30px,30px,200px);
    -ms-transform: translate3d(30px,30px,200px);
    -o-transform: translate3d(30px,30px,200px);
    transform: translate3d(30px,30px,200px);
}

效果:

image

 

2.3D旋轉

在三維變形中,咱們可讓元素在任何軸旋轉。爲此,CSS3新增三個旋轉函數:rotateX()、rotateY()和rotateZ()。

隨着度數的增長,直觀效果上:

X:以方框X軸,從下向上旋轉

Y:以方框y軸,從左向右旋轉

Z:以方框中心爲原點,順時針旋轉

xyz

rotate3d()中取值說明:

 

x:是一個0到1之間的數值,主要用來描述元素圍繞X軸旋轉的矢量值;
y:是一個0到1之間的數值,主要用來描述元素圍繞Y軸旋轉的矢量值;
z:是一個0到1之間的數值,主要用來描述元素圍繞Z軸旋轉的矢量值;
a:是一個角度值,主要用來指定元素在3D空間旋轉的角度,若是其值爲正值,元素順時針旋轉,反之元素逆時針旋轉。

下面介紹的三個旋轉函數功能等同:


rotateX(a)函數功能等同於rotate3d(1,0,0,a)
rotateY(a)函數功能等同於rotate3d(0,1,0,a)
rotateZ(a)函數功能等同於rotate3d(0,0,1,a)


注:a指的是一個旋轉角度值。turn是圈,1turn = 360deg;另外還有弧度rad,2πrad = 1turn = 360deg。如,transform:rotate(2turn); //旋轉兩圈

例子:

.stage {
    width: 300px;
    height: 300px;
    float: left;
    margin: 15px;
    position: relative;
    background: url(http://www.w3cplus.com/sites/default/files/blogs/2013/1311/bg.jpg) repeat center center;

    -webkit-perspective: 1200px;
    -moz-perspective: 1200px;
    -ms-perspective: 1200px;
    -o-perspective: 1200px;
    perspective: 1200px;
}
.container {
    position: absolute;
    top: 50%;
    left: 50%;

    -webkit-transform-style: preserve-3d;
    -moz-transform-style: preserve-3d;
    -ms-transform-style: preserve-3d;
    -o-transform-style: preserve-3d;
    transform-style: preserve-3d;
}
.container img {
    position: absolute;
    margin-left: -70px;
    margin-top: -100px; 
}
.container img:nth-child(1){
    z-index: 1;
    opacity: .6;
}

.s4 img{
    z-index: 2; 
    -webkit-transform:rotate3d(.6,1,.6,45deg);
    -moz-transform:rotate3d(.6,1,.6,45deg);
    -ms-transform:rotate3d(.6,1,.6,45deg);
    -o-transform:rotate3d(.6,1,.6,45deg);
    transform:rotate3d(.6,1,.6,45deg);
}

效果:

image

3.3D縮放

經過使用3D縮放函數,可讓元素在Z軸上按比例縮放。默認值爲1,當值大於1時,元素放大,反之小於1大於0.01時,元素縮小。當scale3d()中X軸和Y軸同時爲1,即scale3d(1,1,sz),其效果等同於scaleZ(sz)。

隨着放大倍數的增長,直觀效果上:

X:以方框Y軸,左右變寬

Y:以方框X軸,上下變高

Z:看不出變換。scaleZ()和scale3d()函數單獨使用時沒有任何效果。

x2y2z3

scaleZ()和scale3d()函數單獨使用時沒有任何效果,須要配合其餘的變形函數一塊兒使用纔會有效果。下面咱們來看一個實例,爲了能看到scaleZ()函數的效果,咱們添加了一個rotateX(45deg)功能:

例子:

.s1 img:nth-child(2){
    z-index: 2; 
    -webkit-transform: scaleZ(5) rotateX(45deg);
    -moz-transform: scaleZ(5) rotateX(45deg);
    -ms-transform: scaleZ(5) rotateX(45deg);
    -o-transform: scaleZ(5) rotateX(45deg);
    transform: scaleZ(5) rotateX(45deg);
}
.s2 img:nth-child(2){
    z-index: 2; 
    -webkit-transform: scaleZ(.25) rotateX(45deg);
    -moz-transform: scaleZ(.25) rotateX(45deg);
    -ms-transform: scaleZ(.25) rotateX(45deg);
    -o-transform: scaleZ(.25) rotateX(45deg);
    transform: scaleZ(.25) rotateX(45deg);
}

效果:

image

4.3D矩陣

CSS3中的3D矩陣要比2D中的矩陣複雜的多了,從二維到三維,是從4到9;而在矩陣裏頭是3*3變成4*4,9到16了。話說又說回來,對於3D矩陣而言,本質上不少東西都與2D一致的,只是複雜程度不同而已。

3D矩陣即爲透視投影,推算方法與2D矩陣相似:

image

代碼表示就是:

matrix3d(sx, 0, 0, 0, 0, sy, 0, 0, 0, 0, sz, 0, 0, 0, 0, 1)

5.3D傾斜

傾斜是二維變形,不能在三維空間變形。元素可能會在X軸和Y軸傾斜,而後轉化爲三維,但它們不能在Z軸傾斜。

三.多重變形

在CSS3中,不論是2D變形仍是3D變形,咱們均可以使用多重變形,他們之間使用空格分隔,具體的語法以下:

transform: <transform-function>  <transform-function> *

其中transfrom-function是指CSS3中的任何變形函數。咱們來看一個使用多重變形制做的立方體。先來看一個使用2D變形制做的立方體:演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        @-webkit-keyframes spin{
            0%{-webkit-transform:rotateY(0deg);transform:rotateY(0deg)}
            100%{-webkit-transform:rotateY(360deg);transform:rotateY(360deg)}
        }
        @-moz-keyframes spin{
            0%{-moz-transform:rotateY(0deg);transform:rotateY(0deg)}
            100%{-moz-transform:rotateY(360deg);transform:rotateY(360deg)}
        }
        @-ms-keyframes spin{        
            0%{-ms-transform:rotateY(0deg);transform:rotateY(0deg)}     100%{-ms-transform:rotateY(360deg);transform:rotateY(360deg)}
        }
        @-o-keyframes spin{     
            0%{-o-transform:rotateY(0deg);transform:rotateY(0deg)}
            100%{-o-transform:rotateY(360deg);transform:rotateY(360deg)}
        }
        @keyframes spin{
            0%{transform:rotateY(0deg)}
            100%{transform:rotateY(360deg)}
        }
        .stage {
            width: 300px;
            height: 300px;
            float: left;
            margin: 15px;
            position: relative;
            background: url(http://www.w3cplus.com/sites/default/files/blogs/2013/1311/bg.jpg) repeat center center;

            -webkit-perspective: 1200px;
            -moz-perspective: 1200px;
            -ms-perspective: 1200px;
            -o-perspective: 1200px;
            perspective: 1200px;
        }
        .container {
            position: relative;
            height: 230px;
            width: 100px;
            top: 50%;
            left: 50%;
            margin: -100px 0 0 -50px;
            -webkit-transform-style: preserve-3d;
            -moz-transform-style: preserve-3d;
            -ms-transform-style: preserve-3d;
            -o-transform-style: preserve-3d;
            transform-style: preserve-3d;
        }
        .container:hover{
            -moz-animation:spin 5s linear infinite;
            -o-animation:spin 5s linear infinite;
            -webkit-animation:spin 5s linear infinite;
            animation:spin 5s linear infinite;
        }
        .side {
            font-size: 20px;
            font-weight: bold;
            height: 100px;
            line-height: 100px;
            color: #fff;
            position: absolute;
            text-align: center;
            text-shadow: 0 -1px 0 rgba(0,0,0,0.2);
            text-transform: uppercase;
            width: 100px;
        }
        .top {
            background: #9acc53;
            -webkit-transform: rotate(-45deg) skew(15deg, 15deg);
            -moz-transform: rotate(-45deg) skew(15deg, 15deg);
            -ms-transform: rotate(-45deg) skew(15deg, 15deg);
            -o-transform: rotate(-45deg) skew(15deg, 15deg);
            transform: rotate(-45deg) skew(15deg, 15deg);
        }
        .left {
            background: #8ec63f;
            -webkit-transform: rotate(15deg) skew(15deg, 15deg) translate(-50%, 100%);
            -moz-transform: rotate(15deg) skew(15deg, 15deg) translate(-50%, 100%);
            -ms-transform: rotate(15deg) skew(15deg, 15deg) translate(-50%, 100%);
            -o-transform: rotate(15deg) skew(15deg, 15deg) translate(-50%, 100%);
            transform: rotate(15deg) skew(15deg, 15deg) translate(-50%, 100%);
        }
        .right {
            background: #80b239;
            -webkit-transform: rotate(-15deg) skew(-15deg, -15deg) translate(50%, 100%);
            -moz-transform: rotate(-15deg) skew(-15deg, -15deg) translate(50%, 100%);
            -ms-transform: rotate(-15deg) skew(-15deg, -15deg) translate(50%, 100%);
            -o-transform: rotate(-15deg) skew(-15deg, -15deg) translate(50%, 100%);
            transform: rotate(-15deg) skew(-15deg, -15deg) translate(50%, 100%);
        }
    </style>
</head>
<body>
    <div class="stage s1">
        <div class="container">
            <div class="side top">1</div>
            <div class="side left">2</div>
            <div class="side right">3</div>
        </div>
    </div>
</body>
</html>

jdfw

上例經過三個面,使用多個2D變形,製做的一個3D立方體,接着咱們在來使用3D多重變形制做一個3D立方體。演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        @-webkit-keyframes spin{
     0%{
         -webkit-transform:rotateY(0deg);
         transform:rotateY(0deg)
       }
      100%{
        -webkit-transform:rotateY(360deg);
        transform:rotateY(360deg)
      }
    }
    @-moz-keyframes spin{
        0%{
            -moz-transform:rotateY(0deg);
            transform:rotateY(0deg)
        }
        100%{
            -moz-transform:rotateY(360deg);
            transform:rotateY(360deg)
        }
    }
    @-ms-keyframes spin{
        0%{
            -ms-transform:rotateY(0deg);
            transform:rotateY(0deg)
        }
        100%{
            -ms-transform:rotateY(360deg);
            transform:rotateY(360deg)
        }
    }
    @-o-keyframes spin{
        0%{
            -o-transform:rotateY(0deg);
            transform:rotateY(0deg)
        }
        100%{
            -o-transform:rotateY(360deg);
            transform:rotateY(360deg)
        }
    }
    @keyframes spin{
        0%{transform:rotateY(0deg)}
        100%{transform:rotateY(360deg)}
    }
    .stage {
        width: 300px;
        height: 300px;
        margin: 15px auto;
        position: relative;
        background: url(http://www.w3cplus.com/sites/default/files/blogs/2013/1311/bg.jpg) repeat center center;

        -webkit-perspective: 300px;
        -moz-perspective: 300px;
        -ms-perspective: 300px;
        -o-perspective: 300px;
        perspective: 300px;
    }
    .container {
        top: 50%;
        left: 50%;
        margin: -100px 0 0 -100px;
        position: absolute;
        -webkit-transform: translateZ(-100px);
        -moz-transform: translateZ(-100px);
        -ms-transform: translateZ(-100px);
        -o-transform: translateZ(-100px);
        transform: translateZ(-100px);
        -webkit-transform-style: preserve-3d;
        -moz-transform-style: preserve-3d;
        -ms-transform-style: preserve-3d;
        -o-transform-style: preserve-3d;
        transform-style: preserve-3d;
    }
    .container:hover{
        -moz-animation:spin 5s linear infinite;
        -o-animation:spin 5s linear infinite;
        -webkit-animation:spin 5s linear infinite;
        animation:spin 5s linear infinite;
    }
    .side {
        background: rgba(142,198,63,0.3);
        border: 2px solid #8ec63f;
        font-size: 60px;
        font-weight: bold;
        color: #fff;
        height: 196px;
        line-height: 196px;
        position: absolute;
        text-align: center;
        text-shadow: 0 -1px 0 rgba(0,0,0,0.2);
        text-transform: uppercase;
        width: 196px;
    }

    .front {
        -webkit-transform: translateZ(100px);
        -moz-transform: translateZ(100px);
        -ms-transform: translateZ(100px);
        -o-transform: translateZ(100px);
        transform: translateZ(100px);
    }
    .back {
        -webkit-transform: rotateX(180deg) translateZ(100px);
        -moz-transform: rotateX(180deg) translateZ(100px);
        -ms-transform: rotateX(180deg) translateZ(100px);
        -o-transform: rotateX(180deg) translateZ(100px);
        transform: rotateX(180deg) translateZ(100px);
    }
    .left {
        -webkit-transform: rotateY(-90deg) translateZ(100px);
        -moz-transform: rotateY(-90deg) translateZ(100px);
        -ms-transform: rotateY(-90deg) translateZ(100px);
        -o-transform: rotateY(-90deg) translateZ(100px);
        transform: rotateY(-90deg) translateZ(100px);
    }
    .right {
        -webkit-transform: rotateY(90deg) translateZ(100px);
        -moz-transform: rotateY(90deg) translateZ(100px);
        -ms-transform: rotateY(90deg) translateZ(100px);
        -o-transform: rotateY(90deg) translateZ(100px);
        transform: rotateY(90deg) translateZ(100px);
    }
    .top {
        -webkit-transform: rotateX(90deg) translateZ(100px);
        -moz-transform: rotateX(90deg) translateZ(100px);
        -ms-transform: rotateX(90deg) translateZ(100px);
        -o-transform: rotateX(90deg) translateZ(100px);
        transform: rotateX(90deg) translateZ(100px);
    }
    .bottom {
        -webkit-transform: rotateX(-90deg) translateZ(100px);
        -moz-transform: rotateX(-90deg) translateZ(100px);
        -ms-transform: rotateX(-90deg) translateZ(100px);
        -o-transform: rotateX(-90deg) translateZ(100px);
        transform: rotateX(-90deg) translateZ(100px);
    }
    </style>
</head>
<body>
    <div class="stage">
        <div class="container">
            <div class="side front">1</div>
            <div class="side back">2</div>
            <div class="side left">3</div>
            <div class="side right">4</div>
            <div class="side top">5</div>
            <div class="side bottom">6</div>
        </div>
    </div>
</body>
</html>

jdfw

四.3D Transform轉換屬性

屬性 描述 CSS
transform 向元素應用 2D 或 3D 轉換。 3
transform-origin 容許你改變被轉換元素的位置。 3
transform-style 規定被嵌套元素如何在 3D 空間中顯示。 3
perspective 規定 3D 元素的透視效果。 3
perspective-origin 規定 3D 元素的底部位置。 3
backface-visibility 定義元素在不面對屏幕時是否可見。 3

1.transform-origin

transform-origin,變形的原點。默認狀況,變形的原點在元素的中心點,或者是元素X軸和Y軸的50%處,以下圖:

image

咱們沒有使用transform-origin改變元素原點位置的狀況下,CSS變形進行的旋轉、移位、縮放等操做都是以元素本身中心(變形原點)位置進行變形的。但不少時候須要在不一樣的位置對元素進行變形操做,咱們就可使用transform-origin來對元素進行原點位置改變,使元素原點不在元素的中心位置,以達到須要的原點位置。

若是咱們把元素變換原點(transform-origin)設置0(x) 0(y),這個時候元素的變換原點轉換到元素的左頂角處,以下圖所示:

image

正如上圖所示,改變transform-origin屬性的X軸和Y軸的值就能夠重置元素變形原點位置,其基本語法以下所示:

transform-origin:[<percentage> | <length> | left | center | right | top | bottom] | [<percentage> | <length> | left | center | right] | [[<percentage> | <length> | left | center | right] && [<percentage> | <length> | top | center | bottom]] <length> ?

上面的語法讓人看得發暈,其實能夠將語法拆分紅:

/*只設置一個值的語法*/
transform-origin: x-offset
transform-origin:offset-keyword
/*設置兩個值的語法*/
transform-origin:x-offset  y-offset
transform-origin:y-offset  x-offset-keyword
transform-origin:x-offset-keyword  y-offset
transform-origin:x-offset-keyword  y-offset-keyword
transform-origin:y-offset-keyword  x-offset-keyword
/*設置三個值的語法*/
transform-origin:x-offset  y-offset  z-offset
transform-origin:y-offset  x-offset-keyword  z-offset
transform-origin:x-offset-keyword  y-offset  z-offset
transform-origin:x-offset-keyword  y-offset-keyword  z-offset
transform-origin:y-offset-keyword  x-offset-keyword  z-offset

2D的變形中的transform-origin屬性能夠是一個參數值,也能夠是兩個參數值。若是是兩個參數值時,第一值設置水平方向X軸的位置,第二個值是用來設置垂直方向Y軸的位置。

3D的變形中的transform-origin屬性還包括了Z軸的第三個值。其各個值的取值簡單說明以下:

-x-offset:用來設置transform-origin水平方向X軸的偏移量,可使用<length>和<percentage>值,同時也能夠是正值(從中心點沿水平方向X軸向右偏移量),也能夠是負值(從中心點沿水平方向X軸向左偏移量)。
-offset-keyword:是top、right、bottom、left或center中的一個關鍵詞,能夠用來設置transform-origin的偏移量。
-y-offset:用來設置transform-origin屬性在垂直方向Y軸的偏移量,可使用<length>和<percentage>值,同時能夠是正值(從中心點沿垂直方向Y軸向下的偏移量),也能夠是負值(從中心點沿垂直方向Y軸向上的偏移量)。
 -x-offset-keyword:是left、right或center中的一個關鍵詞,能夠用來設置transform-origin屬性值在水平X軸的偏移量。
-y-offset-keyword:是top、bottom或center中的一個關鍵詞,能夠用來設置transform-origin屬性值在垂直方向Y軸的偏移量。
 -z-offset:用來設置3D變形中transform-origin遠離用戶眼睛視點的距離,默認值z=0,其取值能夠<length>,不過<percentage>在這裏將無效。


看上去transform-origin取值與background-position取值相似。爲了方便記憶,能夠把關鍵詞和百分比值對比起來記:

 top = top center = center top = 50% 0
 right = right center = center right = 100%或(100% 50%)
 bottom = bottom center = center bottom = 50% 100%
 left = left center = center left = 0或(0 50%)
 center = center center = 50%或(50% 50%)
 top left = left top = 0 0
 right top = top right = 100% 0
 bottom right = right bottom = 100% 100%
 bottom left = left bottom = 0 100%

2.transform-style

transform-style屬性是3D空間一個重要屬性,指定嵌套元素如何在3D空間中呈現。他主要有兩個屬性值:flat和preserve-3d。

transform-style屬性的使用語法很是簡單:

transform-style: flat | preserve-3d

其中flat值爲默認值,表示全部子元素在2D平面呈現。preserve-3d表示全部子元素在3D空間中呈現。

也就是說,若是對一個元素設置了transform-style的值爲flat,則該元素的全部子元素都將被平展到該元素的2D平面中進行呈現。沿着X軸或Y軸方向旋轉該元素將致使位於正或負Z軸位置的子元素顯示在該元素的平面上,而不是它的前面或者後面。若是對一個元素設置了transform-style的值爲preserve-3d,它表示不執行平展操做,他的全部子元素位於3D空間中。

transform-style屬性須要設置在父元素中,而且高於任何嵌套的變形元素。

例如:

image

要在.span裏添加

transform-style: preserve-3d;

3.perspective

perspective屬性對於3D變形來講相當重要。該屬性會設置查看者的位置,並將可視內容映射到一個視錐上,繼而投到一個2D視平面上。若是不指定透視,則Z軸空間中的全部點將平鋪到同一個2D視平面中,而且變換結果中將不存在景深概念。

上面的描述可能讓人難以理解一些,其實對於perspective屬性,咱們能夠簡單的理解爲視距,用來設置用戶和元素3D空間Z平面之間的距離。而其效應由他的值來決定,值越小,用戶與3D空間Z平面距離越近,視覺效果更使人印象深入;反之,值越大,用戶與3D空間Z平面距離越遠,視覺效果就很小。

在3D變形中,對於某些變形,例以下面的示例演示的沿Z軸的變形,perspective屬性對於查看變形的效果來講必不可少。

咱們先來看一個簡單的實例,製做一個撲克牌3D旋轉效果,而且一個在撲克牌的父元素添加了視距perspective,而另外一個卻沒有設置:

div {
    width: 500px;
    height: 300px;
    margin: 30px auto;
    position: relative;
    background: url(images/bg-grid.jpg) no-repeat center center;
    background-size: 100% 100%;
}
div img {
    position: absolute;
    top: 50%;
    left: 50%;
    margin-left: -71px;
    margin-top: -100px; 
    transform-origin: bottom;
}
div img:nth-child(1){
    opacity: .5;
    z-index: 1;
}
div img:nth-child(2){
    z-index: 2;
    transform: rotateX(45deg);
}
div:nth-of-type(2){
    perspective: 500px;
}

效果以下:

image

 

上圖的效果徹底說明了一切。父節點沒有設置perspective的狀況下,梅花King的3D旋轉效果不明顯,而在父節點設置perspective後,梅花King纔像個3D旋轉。

上例簡單的演示了perspective的使用方法,咱們回過頭來,看看perspective的使用語法:

perspective:none | <length>

perspective屬性包括兩個屬性:none和具備單位的長度值。其中perspective屬性的默認值爲none,表示無限的角度來看3D物體,但看上去是平的。另外一個值<length>接受一個長度單位大於0的值。並且其單位不能爲百分比值。<length>值越大,角度出現的越遠,從而建立一個至關低的強度和很是小的3D空間變化。反之,此值越小,角度出現的越近,從而建立一個高強度的角度和一個大型3D變化。

好比你站在10英尺和1000英尺的地方看一個10英尺的立方體。在10英尺的地方,你距離立方體是同樣的尺寸。所以視角轉變遠遠大於站在1000英尺處的,立體尺寸是你距離立方體距離的百分之一。一樣的思惟適用於perspective的<length>值。咱們一塊兒來看一個實例,來增強這方面的理解:演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .wrapper {
        width: 50%;
        float: left;
        }
        .cube {
            font-size: 4em;
            width: 2em;
            margin: 1.5em auto;
            transform-style: preserve-3d;
            transform: rotateX(-40deg) rotateY(32deg);
        }
        .side {
            position: absolute;
            width: 2em;
            height: 2em;
            background: rgba(255, 99, 71, 0.6);
            border: 1px solid rgba(0, 0, 0, 0.5);
            color: white;
            text-align: center;
            line-height: 2em;
        }
        .front {
            transform: translateZ(1em);
        }
        .top {
            transform: rotateX(90deg) translateZ(1em);
        }
        .right {
            transform: rotateY(90deg) translateZ(1em);
        }
        .left {
            transform: rotateY(-90deg) translateZ(1em);
        }
        .bottom {
            transform: rotateX(-90deg) translateZ(1em);
        }

        .back {
            transform: rotateY(-180deg) translateZ(1em);
        }
        .w1 {
            perspective: 100px;
        }
        .w2{
            perspective: 1000px;
        }
    </style>
</head>
<body>
    <div class="wrapper w2">
        <div class="cube">
            <div class="side  front">1</div>
            <div class="side   back">6</div>
            <div class="side  right">4</div>
            <div class="side   left">3</div>
            <div class="side    top">5</div>
            <div class="side bottom">2</div>
        </div>
    </div>
    <div class="wrapper w1">
        <div class="cube">
            <div class="side  front">1</div>
            <div class="side   back">6</div>
            <div class="side  right">4</div>
            <div class="side   left">3</div>
            <div class="side    top">5</div>
            <div class="side bottom">2</div>
        </div>
    </div>
</body>
</html>

image

依據上面的介紹,咱們可對perspective取值作一個簡單的結論:

-perspective取值爲none或不設置,就沒有真3D空間。
-perspective取值越小,3D效果就越明顯,也就是你的眼睛越靠近真3D。
-perspective的值無窮大,或值爲0時與取值爲none效果同樣。

4.perspective-origin

perspective-origin屬性是3D變形中另外一個重要屬性,主要用來決定perspective屬性的源點角度。它實際上設置了X軸和Y軸位置,在該位置觀看者好像在觀看該元素的子元素。

perspective-origin屬性的使用語法也很簡單:

perspective-origin:[<percentage> | <length> | left | center | right | top | bottom] | [[<percentage> | <length> | left | center | right] && [<percentage> | <length> | top | center | bottom]]

該屬性的默認值爲「50% 50%」(也就是center),其也能夠設置爲一個值,也能夠設置爲兩個長度值:

第一個長度值指定相對於元素的包含框的X軸上的位置。它能夠是長度值(以受支持的長度單位表示)、百分比或如下三個關鍵詞之一:left(表示在包含框的X軸方向長度的0%),center(表示中間點),或right(表示長度的100%)。
第二個長度值指定相對於元素的包含框的Y軸上的位置。它能夠是長度值、百分比或如下三個關鍵詞之一:top(表示在包含框的Y軸方向長度的0%),center(表示中間點),或bottom(表示長度的100%)。
注意,爲了指轉換子元素變形的深度,perspective-origin屬性必須定義父元素上。一般perspective-origin屬性自己不作任何事情,它必須被定義在設置了perspective屬性的元素上。換句話說,perspective-origin屬性須要與perspective屬性結合起來使用,以便將視點移至元素的中心之外位置

image

5.backface-visibility

backface-visibility屬性決定元素旋轉背面是否可見。對於未旋轉的元素,該元素的正面面向觀看者。當其Y軸旋轉約180度時會致使元素的背面面對觀衆。

backface-visibility屬性使用語法:

backface-visibility: visible | hidden

該屬性被設置爲如下兩個關鍵詞之一:

 visible:爲backface-visibility的默認值,表示反面可見
hidden:表示反面不可見
一個元素的可見性與「backface-visibility:hidden」決定以下:

元素在3D環境下渲染上下文,將根據3D變形矩陣來計算,反之元素不在3D環境下渲染上下文,將根據2D變形矩陣來計算。
若是組件的矩陣在第3行、3列是負值,那麼元素反面是隱藏,反之是可見的。
簡單點來講,backface-visibility屬性可用於隱藏內容的背面。默認狀況下,背面可見,這意味着即便在翻轉後,旋轉的內容仍然可見。但當backface-visibility設置爲hidden時,旋轉後內容將隱藏,由於旋轉後正面將再也不可見。該功能可幫助您模擬多面的對象,例以下例中使用的紙牌。經過將backface-visibility設置爲hidden,您能夠輕鬆確保只有正面可見。

咱們經過3D立方體來作一個實例,讓你能從視覺上更能直能的區分backface-visibility取值爲hidden和visible的區別:演示

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
    <style>
        .container {
          width: 500px;
          height: 300px;
          float: left;
          position: relative;
          margin: 30px;
          border: 1px solid #CCC;
          perspective: 1200px;
        }
        .cube {
          width: 100%;
          height: 100%;
          position: absolute;
          animation: spinCube 8s infinite ease-in-out;
          transform-style: preserve-3d;
          transform: translateZ( -100px );
        }
        @keyframes spinCube {
          0% { 
            transform: translateZ( -100px ) rotateX(   0deg ) rotateY(   0deg ); 
            }
          100% {
            transform: translateZ( -100px ) rotateX( 360deg ) rotateY( 360deg ); 
          }
        }

        .side {
         display: block;
         position: absolute;
         width: 196px;
         height: 196px;
         border: 2px solid black;
         line-height: 196px;
         font-size: 120px;
         font-weight: bold;
         color: white;
         text-align: center;
        }

        .cube.backface-visibility-visible .side {
          backface-visibility: visible;
        }
        .cube.backface-visibility-hidden .side {
          backface-visibility: hidden;
        }

        .cube .front  { background: hsla(   0, 100%, 50%, 0.7 ); }
        .cube .back   { background: hsla(  60, 100%, 50%, 0.7 ); }
        .cube .right  { background: hsla( 120, 100%, 50%, 0.7 ); }
        .cube .left   { background: hsla( 180, 100%, 50%, 0.7 ); }
        .cube .top    { background: hsla( 240, 100%, 50%, 0.7 ); }
        .cube .bottom { background: hsla( 300, 100%, 50%, 0.7 ); }

        .cube .front  {
          transform: translateZ( 100px );
        }
        .cube .back {
          transform: rotateX( -180deg ) translateZ( 100px );
        }
        .cube .right {
          transform: rotateY(   90deg ) translateZ( 100px );
        }
        .cube .left {
          transform: rotateY(  -90deg ) translateZ( 100px );
        }
        .cube .top {
          transform: rotateX(   90deg ) translateZ( 100px );
        }
        .cube .bottom {
          transform: rotateX(  -90deg ) translateZ( 100px );
        }   
    </style>
</head>
<body>
    <div class="container">
        <h1>backface-visibility:visible</h1>
        <div class="cube backface-visibility-visible">
            <div class="side front">1</div>
            <div class="side back">2</div>
            <div class="side right">3</div>
            <div class="side left">4</div>
            <div class="side top">5</div>
            <div class="side bottom">6</div>
        </div>
    </div>  

    <div class="container">
        <h1>backface-visibility:hidden</h1>
        <div class="cube backface-visibility-hidden">
            <div class="side front">1</div>
            <div class="side back">2</div>
            <div class="side right">3</div>
            <div class="side left">4</div>
            <div class="side top">5</div>
            <div class="side bottom">6</div>
        </div>
    </div>
</body>
</html>

jdfw

上圖中左邊立方體每一個頁咱們都能看獲得,而右邊的立方體咱們只能看到視力範圍的面。

-------------------------------------------------------------------------------------------------------------------------------------

CSS3動畫理解與應用

轉載需註明轉載字樣,標註原做者和原博文地址。

相關文章
相關標籤/搜索