1. 程式人生 > >CSS變形動畫

CSS變形動畫

CSS變形動畫

前言

  在開始介紹CSS變形動畫之前,可以先了解一下學習了它之後能做什麼,有什麼用,這樣你看這篇文章可能會有一些動力。

  學習了CSS變形動畫後,你可以為你的頁面做出很多炫酷的效果,如一個3D的魔方,一個很酷的旋轉選單等等。

  在本章節中將會採用大量的例項進行演示,相信你如果看完這篇文章後寫出的頁面會更加的吸引眼球。

 

 

 

基礎知識

座標系統


  首先我們要學習的變形動畫,想達到在上圖中出現的3D效果單純的X與Y兩個軸是實現不了的,還需要加入一條縱深軸,即Y軸的參與才有一個3D的視覺感受。

  那麼如何來理解X,Y,Z這三條軸的關係呢?可以看一下下面這張圖。

 

  X軸代表水平軸

  Y軸代表垂直軸

  Z軸代表縱深軸

 

 

  X和Y軸都非常好理解,怎麼理解這個Z軸呢?

  CSS的中文名稱叫做層疊樣式表,那麼它肯定是一層一層的。之前學習過z-index就是用來設定層的優先順序,優先順序越高越在上面,也可以理解為離我們肉眼越近,它把優先順序低的層給蓋住了,所以Z軸可以理解為我們觀察的視角與被觀察物體之間的一條軸。

  Z軸數值越大,說明觀測距離越遠。

  Z軸的數值可以無限大,所以設定的時候一定要小心。

 

變形操作


  可以使用transform規則控制元素的變形操作,包括元素移動、旋轉、傾斜、3D轉換等等。

  下表中是CSS提供的變形動作,在接下來的學習中將會對一個變形動作進行詳解。

 

選項說明
none 定義不進行轉換。
translate(x,y) 定義 2D 轉換。
translate3d(x,y,z) 定義 3D 轉換。
translateX(x) 定義轉換,只是用 X 軸的值。
translateY(y) 定義轉換,只是用 Y 軸的值。
translateZ(z) 定義 3D 轉換,只是用 Z 軸的值。
scale(x,y) 定義 2D 縮放轉換。
scale3d(x,y,z) 定義 3D 縮放轉換。
scaleX(x) 通過設定 X 軸的值來定義縮放轉換。
scaleY(y) 通過設定 Y 軸的值來定義縮放轉換。
scaleZ(z) 通過設定 Z 軸的值來定義 3D 縮放轉換。
rotate(angle) 定義 2D 旋轉,在引數中規定角度。
rotate3d(x,y,z,angle) 定義 3D 旋轉。
rotateX(angle) 定義沿著 X 軸的 3D 旋轉。
rotateY(angle) 定義沿著 Y 軸的 3D 旋轉。
rotateZ(angle) 定義沿著 Z 軸的 3D 旋轉。
skew(x-angle,y-angle) 定義沿著 X 和 Y 軸的 2D 傾斜轉換。
skewX(angle) 定義沿著 X 軸的 2D 傾斜轉換。
skewY(angle) 定義沿著 Y 軸的 2D 傾斜轉換。
perspective(n) 為 3D 轉換元素定義透視檢視。

 

變形疊加


  這其實是一個坑點,在使用變形中一定要注意,重複對元素設定變形操作時只在元素的原形態上操作。

  我們可以先看一下下面的案例,不懂程式碼沒關係,懂這個意思就行了。

 

  預設處理

  下面設定了兩次移動,並不會移動550px 而是隻移動50px

  我們在元素中先設定了右移500px,滑鼠放上去時再往右移動50px,可是下面卻出現了向左移動的場景,這是因為對div進行了位置居中處理,它必須要按照之前居中的位置進行50px的移動。而不是按照居中後設置的500px的地方再進行向右移動50px

  上面這句話有點繞,總之。上面設定了,位置改變了,下面再設定,不會按照已改變的位置進行變化,而是按照原位置。

 

 

 

<!DOCTYPE html>
<html lang="en">
​
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
​
        <style>
​
                *{
                        margin: 0;
                        padding: 0;
                        box-sizing: border-box;
                        list-style: none;
                }
​
                body {
                        height: 100vh;
                        width: 100vw;
                        
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }
​
                div{
                        width: 200px;
                        height: 200px;
                        
                        /* 意思就是說按x軸移動500px */
                        transform: translateX(500px);
                        /* 過渡時間2s */
                        transition: 2s;
​
                }
​
                div:hover{
                         /* 意思就是說按x軸移動50px */
                        transform: translateX(50px);
                }
​
        </style>
</head>
​
<body>
​
        <div></div>
​
</body>
​
</html>
程式碼示例

 

偽類疊加

  還是設定兩次移動,如果移動的方向都一樣,且偽類設定的移動比原本的移動多一點,就在原本的基礎上直接進行變形,而不用再找開始位置了。

  我們還是拿上面的案例,只不過偽類移動的數值將50px改為600px,比第一次設定大100px,那麼此時他就不會再往左走,而是直接在原有基礎上進行疊加,向右移動100px

 

 

<!DOCTYPE html>
<html lang="en">
​
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
​
        <style>
​
                *{
                        margin: 0;
                        padding: 0;
                        box-sizing: border-box;
                        list-style: none;
                }
​
                body {
                        height: 100vh;
                        width: 100vw;
                        
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }
​
                div{
                        width: 200px;
                        height: 200px;
                        
                        /* 意思就是說按x軸移動500px */
                        transform: translateX(500px);
                        /* 過渡時間2s */
                        transition: 2s;
​
                }
​
                div:hover{
                         /* 意思就是說按x軸移動600px */
                        transform: translateX(600px);
                }
​
        </style>
</head>
​
<body>
​
        <div></div>
​
</body>
​
</html>
程式碼示例

 

內聯元素


  內聯元素即行級元素,inline元素是不能參與變形的,將其轉為 inline-blockblock 以及彈性元素時才可以產生變化效果。

 

:hover偽類


  滑鼠移動到某一元素上發生的使用者行為。

  當該行為出現時,我們可以為它指定一些引數的改變。

 

  如下,改變顏色。

 

 

:target偽類


  意思就是說你點選一個<a>,該<a>標籤中的href指向的錨點標籤會發生變化。

  點選第一個<a>元素,與之相對的錨點元素髮生變化。

  點選第二個<a>元素,與第一個<a>元素相對的錨點變化停止,與第二個<a>元素相對的錨點發生變化。

 

<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
                 * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }
​
                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        flex-flow: column;
                        justify-content: center;
                        align-items: center;
                }
​
                div{
                        width: 200px;
                        height: 200px;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                        color: #fff;
                        font-size: 2em;
                }
​
                div:nth-child(1) {
                        background:red;
​
                }
                div:nth-child(2) {
                        background:blue;
​
                }
                #div-1:target{
                        
                }
                #div-2:target{
                        
                }
        </style>
</head>
<body>
        <div id="div-1">原本顏色:紅</div>
        <div id="div-2">原本顏色:藍</div>
        <a href="#div-1">讓div-1變綠</a>
        <a href="#div-2">讓div-2變黑</a>
</body>
</html>
程式碼示例

 

最後注意一點


  事件元素上放過渡時間,:hover上放具體的事件,如移動,旋轉,傾斜等操作。

  如果你設定了移動卻將過渡時間放在了:hover裡面,那麼就會出現下面這種情況。

  可以看見,直勾勾的就回來了,這種效果顯然不是我們想要的。

 

 

<!DOCTYPE html>
<html lang="en">
​
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }
​
                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }
​
                main {
                        width: 400px;
                        height: 200px;
                        border: 1px solid #ccc;
                        display: flex;
                        justify-content: center;
                        align-items: center;
​
                        /* 為了設定第一個div的中心點,所以這裡設定一個定位,讓子元素的絕對定位參照該元素進行偏移 */
                        position: relative;
                }
​
                div:first-child {
                        height: 8px;
                        width: 8px;
                        
​
                        z-index: 1;
                        border-radius: 50%;
​
                        /* 脫離文件流並居中 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        margin-left: -4px;
                        margin-top: -4px;
​
                }
​
                div:last-child {
                        height: 100px;
                        width: 100px;
                        
                        /* 過渡時間1s,應該放這裡,而不是:hover上面 */
                        /* transition: 1s; */
                       
                }
​
                 div:last-child:hover {
                        transform: translateX(100px);
                }
                
        </style>
</head>
​
<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>
​
</html>
程式碼示例

 

移動元素

 

  • 沿X軸移動時正值向右移動、負值向左移動

  • 沿Y軸移動時正值向下移動、負值向上移動

  • 如果使用百分數將控制元素的原尺寸計算百分比然後移動

  • 可同時設定多個值,解析器會從左向右依次執行

  • 變形是在原基礎上更改,即第二次設定值時不是在第一次值上變化

 

translateX


  控制元素在X軸上的移動,正值向右、負值向左。

  如,我們下面設定translateX(100px),過渡時間為1s

 

 

<!DOCTYPE html>
<html lang="en">
​
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }
​
                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }
​
                main {
                        width: 400px;
                        height: 200px;
                        border: 1px solid #ccc;
                        display: flex;
                        justify-content: center;
                        align-items: center;
​
                        /* 為了設定第一個div的中心點,所以這裡設定一個定位,讓子元素的絕對定位參照該元素進行偏移 */
                        position: relative;
                }
​
                div:first-child {
                        height: 8px;
                        width: 8px;
                        
​
                        z-index: 1;
                        border-radius: 50%;
​
                        /* 脫離文件流並居中 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        margin-left: -4px;
                        margin-top: -4px;
​
                }
​
                div:last-child {
                        height: 100px;
                        width: 100px;
                        
                        /* 過渡時間1s,應該放這裡,而不是:hover上面 */
                        transition: 1s;
                       
                }
​
                div:last-child:hover {
                        transform: translateX(100px);
                }
                
        </style>
</head>
​
<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>
​
</html>
程式碼示例

 

translateY


  控制元素在X軸上的移動,正值向下、負值向上。

  如,我們下面設定translateY(100px),過渡時間為1s

<!DOCTYPE html>
<html lang="en">
​
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }
​
                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }
​
                main {
                        width: 200px;
                        height: 400px;
                        border: 1px solid #ccc;
                        display: flex;
                        justify-content: center;
                        align-items: center;
​
                        /* 為了設定第一個div的中心點,所以這裡設定一個定位,讓子元素的絕對定位參照該元素進行偏移 */
                        position: relative;
                }
​
                div:first-child {
                        height: 8px;
                        width: 8px;
                        
​
                        z-index: 1;
                        border-radius: 50%;
​
                        /* 脫離文件流並居中 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        margin-left: -4px;
                        margin-top: -4px;
​
                }
​
                div:last-child {
                        height: 100px;
                        width: 100px;
                        
                        /* 過渡時間1s,應該放這裡,而不是:hover上面 */
                        transition: 1s;
                       
                }
​
                div:last-child:hover {
                        transform: translateY(100px);
                }
​
        </style>
</head>
​
<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>
​
</html>
程式碼示例

 

translate


  translatetranslateX以及translateY的簡寫模式,第一個值控制X移動,第二個值控制Y移動。

  一句話,設定X與Y軸的移動,注意,這個方法中不包含Z軸,因為一旦有Z軸參與就會變為3D效果。

 

 

<!DOCTYPE html>
<html lang="en">
​
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }
​
                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }
​
                main {
                        width: 400px;
                        height: 400px;
                        border: 1px solid #ccc;
                        display: flex;
                        justify-content: center;
                        align-items: center;
​
                        /* 為了設定第一個div的中心點,所以這裡設定一個定位,讓子元素的絕對定位參照該元素進行偏移 */
                        position: relative;
                }
​
                div:first-child {
                        height: 8px;
                        width: 8px;
                        
​
                        z-index: 1;
                        border-radius: 50%;
​
                        /* 脫離文件流並居中 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        margin-left: -4px;
                        margin-top: -4px;
​
                }
​
                div:last-child {
                        height: 100px;
                        width: 100px;
                        
                        /* 過渡時間1s,應該放這裡,而不是:hover上面 */
                        transition: 1s;
                       
                }
​
                div:last-child:hover {
                        /* 先設定X軸,再設定Y軸 */
                        transform: translate(100px,100px);
                }
​
        </style>
</head>
​
<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>
​
</html>
程式碼示例

 

百分比移動


  當要移動的元素寬高為100px時,如果使用50%進行移動,則代表移動50px

 

 

<!DOCTYPE html>
<html lang="en">
​
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }
​
                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }
​
                main {
                        width: 400px;
                        height: 400px;
                        border: 1px solid #ccc;
                        display: flex;
                        justify-content: center;
                        align-items: center;
​
                        /* 為了設定第一個div的中心點,所以這裡設定一個定位,讓子元素的絕對定位參照該元素進行偏移 */
                        position: relative;
                }
​
                div:first-child {
                        height: 8px;
                        width: 8px;
                        
​
                        z-index: 1;
                        border-radius: 50%;
​
                        /* 脫離文件流並居中 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        margin-left: -4px;
                        margin-top: -4px;
​
                }
​
                div:last-child {
                        height: 100px;
                        width: 100px;
                        
                        /* 過渡時間1s,應該放這裡,而不是:hover上面 */
                        transition: 1s;
                       
                }
​
                div:last-child:hover {
                        /* 先設定X軸,再設定Y軸 */
                        transform: translate(50%,50%);
                }
​
        </style>
</head>
​
<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>
​
</html>
程式碼示例

 

元素居中


  我們之前介紹過很多元素居中的方法,如定位操作,彈性盒模型,其實使用移動也可以達到元素居中的效果。

  給你丟一套模板。

 

/* 讓子元素脫離文件流並參照副父級元素偏移。這是定位+margin的居中方法 */
position: absolute;
left: 50%;
top: 50%;
/* left和top設定子元素寬高的負的50%就行 */
margin-left: -3px;
margin-top: -3px;

 

/* 這是彈性盒模型控制元素居中的方法 */
display: flex;
justify-content: center;
align-items: center;

 

/* 讓子元素脫離文件流並參照副父級元素偏移。這是定位+移動的居中方法 */
position: absolute;
left: 50%;
top: 50%;
/* X和Y設定子元素寬高的負的50%就行 */
transform: translate(-50%, -50%);

 

 

translateZ


  控制Z軸移動,正數向外(距離我們近)、負數向裡移動(距離我們遠)。因為Z軸是透視軸沒有像X/Y一樣的固定尺寸,所以不能使用百分數。

 

 

 

<!DOCTYPE html>
<html lang="en">

<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>

        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }

                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }

                main {
                        width: 200px;
                        height: 200px;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                        border: 1px solid #ccc;

                        /* 如果將Z軸移動的:hover放在div上,我們不方便一直將滑鼠放在div上面,故我們設定成放在main上面讓div進行Z軸移動 */
                        /* 為了更好的視覺效果,我們給main容器做一個透視 ,並且讓它按照Y軸旋轉60度,按Z軸放大5倍*/
                        transform: perspective(900px) rotateY(60deg) scaleZ(5);
                        /* 使用 transform-style 用於控制3d透視 */
                        transform-style: preserve-3d;

                }


                main:hover div:nth-child(2) {
                        transform: translateZ(-100px);
                }

                div {
                        height: 100px;
                        width: 100px;
                        background-color: blueviolet;

                        /* 讓子元素脫離文件流並參照副父級元素偏移。這是定位+移動的居中方法 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        transform: translate(-50%, -50%);
                }

                div:nth-child(1) {
                        background-color: yellow;

                }

                div:nth-child(2) {
                        background-color: blueviolet;
                        /* 過渡時間1s */
                        transition: 1s;
                }
        </style>
</head>

<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>

</html>
程式碼示例

 

translate3d


  用於同時控制X/Y/Z軸的移動,三個值必須輸入如果某個軸不需要移動時設定為零。

 

<!DOCTYPE html>
<html lang="en">

<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>

        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }

                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }

                main {
                        width: 200px;
                        height: 200px;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                        border: 1px solid #ccc;

                        /* 如果將Z軸移動的:hover放在div上,我們不方便一直將滑鼠放在div上面,故我們設定成放在main上面讓div進行Z軸移動 */
                        /* 為了更好的視覺效果,我們給main容器做一個透視 ,並且讓它按照Y軸旋轉60度,按Z軸放大5倍*/
                        transform: perspective(900px) rotateY(60deg) scaleZ(5);
                        /* 使用 transform-style 用於控制3d透視 */
                        transform-style: preserve-3d;

                }


                main:hover div:nth-child(2) {
                        /* 由於Z軸可以無限遠,所以不能用百分比 */
                        transform: translate3d(50%, 50%, 100px);
                }

                div {
                        height: 100px;
                        width: 100px;
                        background-color: blueviolet;

                        /* 讓子元素脫離文件流並參照副父級元素偏移。這是定位+移動的居中方法 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        transform: translate(-50%, -50%);
                }

                div:nth-child(1) {
                        background-color: yellow;

                }

                div:nth-child(2) {
                        background-color: blueviolet;
                        /* 過渡時間1s */
                        transition: 1s;
                }
        </style>
</head>

<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>

</html>
程式碼示例

 

漸變輸入框


 

 

<!DOCTYPE html>
<html lang="en">

<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>

        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }

                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                        background: #34495e;
                }

                #form-style-gradient {
                        width: 200px;
                        height: 200px;
                        display: flex;
                        flex-flow: column;
                        justify-content: center;
                        align-items: center;
                        border: 1px solid #ccc;

                }

                #form-style-gradient label input {

                        padding: 10px;
                        outline: none;
                        border: none;
                        background-color: #ecf0f1;



                }

                #form-style-gradient label {
                        width: 80%;
                        position: relative;
                        overflow: hidden;
                        margin-bottom: 20px;
                        display: flex;
                        flex-flow: column;
                        justify-content: center;
                        align-self: center;
                }

                #form-style-gradient label::before {
                        content: '';
                        position: absolute;
                        /* 移動到最下面 */
                        left: 0;
                        bottom: 0;

                        height: 2px;
                        width: 100%;

                        background: linear-gradient(to right, white, #1abc9c, #f1c40f, #e74c3c, white);
                        /* 移動到label標籤外,然後會被隱藏掉 */
                        transform: translateX(-100%);
                        transition: 2s;

                }


                #form-style-gradient label:hover::before {
                        /* 移動回來 */
                        transform: translateX(100%);
                }

        </style>
</head>

<body>

        <form id="form-style-gradient" action="">
                <label>
                        <input type="text" name="username" placeholder="請輸入使用者名稱">
                </label>
                <label>
                        <input type="text" name="pwd" placeholder="請輸入密碼">
                </label>
        </form>

</body>

</html>
程式碼示例

 

頁面切換


 

 

<!DOCTYPE html>
<html lang="en">

<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
        <style>
                * {
                        padding: 0;
                        margin: 0;
                }

                a {
                        text-decoration: none;
                }

                body {
                        display: flex;
                        width: 100vw;
                        height: 100vh;
                        flex-direction: column;
                }

                main {
                        position: relative;
                        background: #f3f3f3;
                        flex: 1;
                        overflow: hidden;
                }

                nav {
                        display: flex;
                        justify-content: space-around;
                        align-items: center;
                        height: 8vh;
                        text-align: center;
                        background: #34495e;
                }

                nav a {
                        flex: 1;
                        font-size: 1.3em;
                        text-transform: uppercase;
                        font-weight: bold;
                        opacity: .8;
                        color: white;
                }

                nav a:nth-child(2) {
                        border-right: solid 1px #aaa;
                        border-left: solid 1px #aaa;
                }

                main>div {
                        position: absolute;
                        left: 0;
                        top: 0;
                        width: 100%;
                        height: 100%;
                        transition: all 1s;
                        z-index: 1;
                        background: #f3f3f3;
                        opacity: 0;
                        display: flex;
                        flex-direction: column;
                        justify-content: center;
                        align-items: center;
                        transform: translate(0, -100%);
                        color: white;
                        font-size: 2em;
                }

                main>div:target {
                        opacity: 1;
                        transform: translate(0%, 0%);
                }

                main>div:nth-of-type(1):target {
                        background: #3498db;
                }

                main>div:nth-of-type(2):target {
                        background: #9b59b6;
                }

                main>div:nth-of-type(3):target {
                        background: #16a085;
                }

                div i[class^="fa"] {
                        font-size: 100px;
                        color: white;
                }
        </style>
</head>

<body>
        <main>
                <div id="home">
                        <i class="fa fa-home" aria-hidden="true"></i>
                        houdunren.com
                </div>
                <div id="video">
                        <i class="fa fa-vimeo" aria-hidden="true"></i>
                </div>
                <div id="live">
                        <i class="fa fa-viadeo" aria-hidden="true"></i>
                </div>
        </main>
        <nav>
                <a href="#home">home</a>
                <a href="#video">video</a>
                <a href="#live">live</a>
        </nav>
</body>

</html>
程式碼示

 

縮放元素

  比如數值為2時表示為原尺寸的兩倍。

  數值為.5時為原尺寸的一半。

 

scaleX


  按X軸縮放一半。

 

 

<!DOCTYPE html>
<html lang="en">

<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }

                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }

                main {
                        width: 400px;
                        height: 200px;
                        border: 1px solid #ccc;
                        display: flex;
                        justify-content: center;
                        align-items: center;

                        /* 為了設定第一個div的中心點,所以這裡設定一個定位,讓子元素的絕對定位參照該元素進行偏移 */
                        position: relative;
                }

                div:first-child {
                        height: 8px;
                        width: 8px;
                        background-color: black;

                        z-index: 1;
                        border-radius: 50%;

                        /* 脫離文件流並居中 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        margin-left: -4px;
                        margin-top: -4px;

                }

                div:last-child {
                        height: 100px;
                        width: 100px;
                        background-color: blueviolet;
                        /* 過渡時間1s,應該放這裡,而不是:hover上面 */
                        transition: 1s;
                       
                }

                div:last-child:hover {
                        transform: scaleX(.5);
                }
                
        </style>
</head>

<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>

</html>
程式碼示例

 

scaleY


  按Y軸縮放一半。

 

 

scale


  使用 scale 可同時設定 X/Y 軸的縮放,如果只設置一個值時表示兩軸縮放相同。

  使用數值定義縮放,如 .5 表示縮小一半,2 表示放大兩倍。

 

 

<!DOCTYPE html>
<html lang="en">

<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }

                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }

                main {
                        width: 200px;
                        height: 400px;
                        border: 1px solid #ccc;
                        display: flex;
                        justify-content: center;
                        align-items: center;

                        /* 為了設定第一個div的中心點,所以這裡設定一個定位,讓子元素的絕對定位參照該元素進行偏移 */
                        position: relative;
                }

                div:first-child {
                        height: 8px;
                        width: 8px;
                        background-color: black;

                        z-index: 1;
                        border-radius: 50%;

                        /* 脫離文件流並居中 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        margin-left: -4px;
                        margin-top: -4px;

                }

                div:last-child {
                        height: 100px;
                        width: 100px;
                        background-color: blueviolet;
                        /* 過渡時間1s,應該放這裡,而不是:hover上面 */
                        transition: 1s;
                       
                }

                div:last-child:hover {
                        transform: scale(.5,2);
                }

        </style>
</head>

<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>

</html>
程式碼示例

 

scaleZ


  沿Z軸縮放元素,需要有3D透視才可以檢視到效果。

 

 

<!DOCTYPE html>
<html lang="en">

<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>

        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }

                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }

                main {
                        width: 200px;
                        height: 200px;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                        border: 1px solid #ccc;

                        /* 如果將Z軸移動的:hover放在div上,我們不方便一直將滑鼠放在div上面,故我們設定成放在main上面讓div進行Z軸移動 */
                        /* 為了更好的視覺效果,我們給main容器做一個透視 ,並且讓它按照Y軸旋轉60度,按Z軸放大5倍*/
                        transform: perspective(900px) rotateY(45deg) scaleZ(5);
                        /* 使用 transform-style 用於控制3d透視 */
                        transform-style: preserve-3d;

                }


                main:hover div:nth-child(2) {
                        /* 放大5倍 */
                        transform: scaleZ(5);
                }

                div {
                        height: 100px;
                        width: 100px;
                        background-color: blueviolet;

                        /* 讓子元素脫離文件流並參照副父級元素偏移。這是定位+移動的居中方法 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        transform: translate(-50%, -50%);
                }

                div:nth-child(1) {
                        background-color: yellow;

                }

                div:nth-child(2) {
                        background-color: blueviolet;
                        /* 過渡時間1s */
                        transition: 1s;
                        transform: translateZ(100px);
                }
        </style>
</head>

<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>

</html>
程式碼示例

 

scale3d


  沿X/Y/Z三個軸縮放元素。

 

<!DOCTYPE html>
<html lang="en">

<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>

        <style>
                * {
                        padding: 0;
                        margin: 0;
                        list-style: none;
                        box-sizing: border-box;
                }

                body {
                        width: 100vw;
                        height: 100vh;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }

                main {
                        width: 200px;
                        height: 200px;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                        border: 1px solid #ccc;

                        /* 如果將Z軸移動的:hover放在div上,我們不方便一直將滑鼠放在div上面,故我們設定成放在main上面讓div進行Z軸移動 */
                        /* 為了更好的視覺效果,我們給main容器做一個透視 ,並且讓它按照Y軸旋轉60度,按Z軸放大5倍*/
                        transform: perspective(900px) rotateY(45deg) scaleZ(5);
                        /* 使用 transform-style 用於控制3d透視 */
                        transform-style: preserve-3d;

                }


                main:hover div:nth-child(2) {
                        /* 放大5倍 */
                        transform: scale3d(.5,.5,.5);
                }

                div {
                        height: 100px;
                        width: 100px;
                        background-color: blueviolet;

                        /* 讓子元素脫離文件流並參照副父級元素偏移。這是定位+移動的居中方法 */
                        position: absolute;
                        left: 50%;
                        top: 50%;
                        transform: translate(-50%, -50%);
                }

                div:nth-child(1) {
                        background-color: yellow;

                }

                div:nth-child(2) {
                        background-color: blueviolet;
                        /* 過渡時間1s */
                        transition: 1s;
                        transform: translateZ(100px);
                }
        </style>
</head>

<body>
        <main>
                <div></div>
                <div></div>
        </main>
</body>

</html>
程式碼示例

 

選單縮放


 

 

 

<!DOCTYPE html>
<html lang="en">
<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <link rel="stylesheet" href="//at.alicdn.com/t/font_1953712_v8yodek5od.css">
        <style>
                *{
                        margin: 0;
                        padding: 0;
                        list-style: none;
                        box-sizing: border-box;
                        text-decoration: none;
                }
                
                body{
                        height: 100vh;
                        width: 100vw;
                        display: flex;
                        flex-flow: column;
                        justify-content: center;
                        align-items: center;
                }

                main{
                        width: 100px;
                }



                div i{
                        display: inline-block;
                        background: darkgray;
                        font-size: 30px !important;
                        display: flex;
                        justify-content: center;
                        align-items: center;
                }


                ul{
                        display: flex;
                        flex-flow: column;
                        justify-content: center;
                        align-items: center;
                        border: 1px solid #ddd;
                        text-transform: uppercase;
                        /* 基點設定為左上 */
                        transform-origin: left top;
                        /* 滑鼠放上去有個小手 */
                        cursor: pointer;
                        /* 透明度 */
                        opacity: .6;
                        transform: scale(0);
                        transition: 1s;
                }

                ul>*{
                        margin: 3px;
                       
                }

                main:hover ul{
                        transform: scale(1);
                        
                }
        </style>
</head>
<body>
        <main>
                <div>
                        <i class="iconfont icon-dingbudaohang-zhangh"></i>
                </div>
                <ul>
                        <li><a href=""></a>我的資料</li>
                        <li><a href=""></a>我的關注</li>
                        <li><a href=""></a>我的收藏</li>
                </ul>
        </main>

</body>
</html>
程式碼示例

 

相簿放大


 

 

<!DOCTYPE html>
<html lang="en">

<head>
        <meta charset="UTF-8">
        <meta name="viewport" content="width=device-width, initial-scale=1.0">
        <title>Document</title>
        <style>
                * {
                        margin: 0;
                        padding: 0;
                        list-style: none;
                        box-sizing: border-box;
                        text-decoration: none;
                }

                body {
                        height: 100vh;
                        width: 100vw;
                        display: flex; 
                        justify-content: center;
                        align-items: center;
                        background-color: deepskyblue;
                }

                img{
              
                        height: 100px;
                        /* 高斯模糊 */
                        filter: blur(10px);
                        transform: scale(.6);
                        transition: .5s;
                        /* 滑鼠小手 */
                        cursor: pointer;
                        border: 3px double black;
                }
                img:hover{
                        filter: none;
                        transform: scale(1.3);
                }

        </style>
</head>

<body>
        <img src="./22.jpg" alt="">
        <img src="./33.jpg" alt="">
        <img src="./初音.jpg" alt="">
</body>

</html>
程式碼示例

 

旋轉元素

  使用CSS可以控制元素按照不同座標軸進行旋轉。

 

rotateX


  控制元素按照X軸進行旋轉操作。單位為deg,即°度的意思。

  按水平軸發生旋轉,如果旋轉90deg 將不可見。

  正數向上翻,負數向下翻。

 

 

  如何讓他可見呢?我們只需要將父級容器也旋轉一下