CSS動畫相關知識詳解

一、CSS3轉換(transform)

css3包括兩種轉換,2D轉換和3D轉換。

css3的轉換允許我們對元素進行旋轉、縮放、移動或傾斜。

不管2D轉換還是3D轉換都是操作的同一個的屬性:transform

1.1 2D轉換

有四種轉換:rotate、scale、translate、skew

1.1.1 translate

在x和y方向平移元素:

transform: translate(500px, 0px);

說明:

參數可以是像素或百分比。

參數1:沿x方向的平移,正表示向右移動

參數2:沿y方向的平移,正表示向下移動

如果是百分比是相對於自己的寬高的百分比。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div{
            width: 200px;
            height: 200px;
            background-color: pink;
        }
        div:nth-of-type(2){
            background-color: gray;
            /*沿x軸平移500px, 沿y軸方向不動*/
            transform: translate(500px, 0px);
        }
    </style>
</head>
<body>
<div></div>
<div></div>

</body>
</html>

如果僅僅沿x或y某一個方向運動,也可以使用:

transform:translateX(200px);

transform:translateY(200px);

1.1.2 rotate

旋轉元素, 是指有沿着 z 軸旋轉。(就是垂直於屏幕的軸)

transform:rotate(10deg);

參數必須是度數。大於0表示順時針旋轉的度數,小於0表示逆時針旋轉的角度。

注意:

  1. 旋轉的時候默認是以元素的幾何中心作爲軸來旋轉的。
  2. 可以使用 transform-origin: offsetX offsetY;來設置旋轉的時候的軸的位置.
transform-origin: 0 0;

1.1.3 scale

對元素進行放大。

transform: scale(倍數);

注意:

  1. 倍數大於表示放大,小於1表示縮小。不需要帶單位
  2. 默認任然是元素中心作爲放大或縮小的參考點
transform: scale(.5);

transform-origin: 0 0;
transform: scale(.5);

1.1..4 skew

skew是傾斜(斜切)。讓元素與x方向或y方向產生傾斜。

transform: skew(40deg,10deg);

參數1:x方向的傾斜度數

參數2:y方向的傾斜度數

transform-origin: 0 0;
transform: skew(40deg,10deg);

1.2 3D轉換

想對2D轉換來說,3D轉換瀏覽器支持的不太好。不過在移動端可以放心的使用。

3D座標系:

默認情況水平向右爲x軸正方形、垂直向下爲y軸正方形、垂直於屏幕向外的爲z軸正方形

1.2.1 perspective屬性

​ perspective(透視)是transform變形3D中最重要的內容。如果不設置透視,元素的3D變形效果將無法實現,所有的變化都會被投影到2D的區域展示。

​ 可以簡單理解爲 視距,用來設置用戶和元素 3D 空間 Z 平面之間的距離。而其效應由他的值來決定,值越小,用戶與 3D 空間 Z 平面距離越近,視覺效果更令人印象深刻;反之,值越大,用戶與3D空間Z平面距離越遠,視覺效果就越小。

要把它用在父容器中。

1.2.2 translate3d(x,y,z)

translate3D(x,y,z) 可以在x,y,z三個方向移動。

translateZ(z) 只在z軸平移

1.2.3 rotate3d(x, y, z, a)

  1. 3d旋轉。 分別表示繞着x,y,z旋轉。 參數中的x,y,z是一個數值。a是一個角度。
  2. 如果a是正值表示順時針旋轉, 如果a是負值表示逆時針旋轉。
  3. x,y,z表示方向矢量,xyz的平方和如果是1的話就是標準矢量,如果不是1就會轉換成一個標準矢量。x,y,z分別分別除以他們的平方和得到的值就是標準矢量。 這三個值決定了將來要旋轉的時候的座標軸。

注意:判斷是順時針還是逆時針,讓逆着座標軸的正放下觀察的。

可以使用rotateX、rotateY、rotateZ表示沿着某個軸的旋轉

rotateX(40deg) 等同於 rotate3d(1,0,0,40deg)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .outer, .inner {
            margin: 100px auto;
            width: 400px;
            height: 400px;
            background-color: gray;
        }
        .outer {
            perspective: 300px;
        }
        .inner {
            background-color: pink;
            transform: rotateX(45deg);
        }
    </style>
</head>
<body>
<div class="outer">
    <div class="inner"></div>
</div>
</body>
</html>

1.2.4 scale3d(sx, sy, sz)

參數分別表示沿着向相應的座標軸的縮放。注意sz其實是縮放的translateZ的值,如果沒有設置translateZ則sz的值無效的。

scaleX、scaleY、scaleZ分別表示x,y,z方向的縮放。

1.2.5 transform-style

表示他的子元素在變形的時候,是在一個2d平面內變形,還是在一個3d平面內變形。

兩個值:flat和preserve-3d

flat:變形仍然在2d空間

preserve-3d:3d空間內變形

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        .outer, .inner {
            margin: 300px auto;
            width: 400px;
            height: 400px;
            background-color: gray;
        }
        .outer {
            transform:rotateY(45deg);
            transform-style: preserve-3d;
        }
        .inner {

            background-color: pink;
            transform:rotateX(60deg);
        }
    </style>
</head>
<body>
<div class="outer">
    <div class="inner"></div>
</div>
</body>
</html>

1.3 正方體案例

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>

        div{
            width: 400px;
            height: 400px;
            text-align: center;
            line-height: 400px;
            font-size: 60px;
        }
        .container{

            position: relative;
            border: 1px dashed #000;
            margin: 200px auto;
            transform: rotateY(30deg) rotateX(30deg);
            transform-style: preserve-3d;
            animation: 10s linear 0s infinite reverse my_rotate;
        }
        .container div{
            position: absolute;
        }
        .font{
            background-color: rgba(100, 100, 100, 1);
            transform: translateZ(200px);
        }
        .back{
            background-color: rgba(80, 255, 133, 1);
            transform: rotateY(180deg) translateZ(200px);
        }
        .left{
            background-color: rgba(255, 57, 56, 1);
            transform: rotateY(-90deg) translateZ(200px);
        }
        .right{
            background-color: rgba(25, 37, 170, 1);
            transform: rotateY(90deg) translateZ(200px);
        }
        .up{
            background-color: rgba(232, 255, 204, 1);
            transform: rotateX(90deg) translateZ(200px);
        }
        .down{
            background-color: rgba(94, 255, 56, 1);
            transform: rotateX(-90deg) translateZ(200px);
        }
        @keyframes my_rotate {
            from{
                transform: rotateY(0deg) rotateX(0deg) rotateZ(0deg);
            }
            to{
                transform: rotateY(360deg) rotateX(360deg) rotateZ(360deg);
            }
        }
    </style>
</head>
<body>
<div class="container">
    <div class="font"></div>
    <div class="back"></div>
    <div class="left"></div>
    <div class="right"></div>
    <div class="up"></div>
    <div class="down"></div>
</div>
</body>
</html>

二、CSS3過渡(transition)

transition屬性定義一個元素兩種狀態之間的過渡。是下面四個屬性的簡寫:

transition-property, transition-duration, transition-timing-function, transition-delay

不同的狀態可以通過僞類像:hover:active來定義。也可以通過js代碼來動態的改變。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>過渡</title>
    <style>
        .box {
            border: 1px solid #000;
            margin: 100px auto;
            display: block;
            width: 100px;
            height: 100px;
            background-color: #0000FF;
            /*過渡的屬性  過渡時間  過渡函數  延遲時間*/
            transition: width 2s linear 1s;
        }
        .box:hover {
            width: 200px;
        }
    </style>
</head>
<body>
<div class="box"></div>
</body>
</html>

如果想同時定義多個過渡屬性,則可以使用逗號分開。

transition: width 2s linear 1s, height 3s linear 2s;

過渡屬性和過渡週期不能省略。

過渡函數主要有以下幾個值:

如果不設置默認是:ease

transition-timing-function: ease;
transition-timing-function: ease-in;
transition-timing-function: ease-out;
transition-timing-function: ease-in-out;
transition-timing-function: linear;
transition-timing-function: step-start;
transition-timing-function: step-end;

延遲時間如果不設置默認是 0s

四、CSS3動畫(animation)

​ 我們在使用 transition實現動畫的時候只能指定要改變的屬性的開始值和結束值,然後在這兩個值之間進行平滑過渡的方式來實現動畫效果,因此不能實現比較複雜的動畫效果

​ 而animation通過定義多個關鍵幀( keyframes )以及定義每個關鍵幀中元素的屬性值來實現更爲複雜的動畫效果。

下面的表格列出了 @keyframes 規則和所有動畫屬性:

屬性 描述 CSS
@keyframes 規定動畫。 3
animation 所有動畫屬性的簡寫屬性,除了 animation-play-state 屬性。 3
animation-name 規定 @keyframes 動畫的名稱。 3
animation-duration 規定動畫完成一個週期所花費的秒或毫秒。默認是 0。 3
animation-timing-function 規定動畫的速度曲線。默認是 “ease”。 3
animation-delay 規定動畫何時開始。默認是 0。 3
animation-iteration-count 規定動畫被播放的次數。默認是 1。 3
animation-direction 規定動畫是否在下一週期逆向地播放。默認是 “normal”。 3
animation-play-state 規定動畫是否正在運行或暫停。默認是 “running”。 3
animation-fill-mode 規定對象動畫時間之外的狀態。 3
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>動畫</title>
    <style>
        div{
            width : 200px;
            height : 200px;
            margin: 200px auto;
            background-color : pink;
            animation-name: my_animation;
            animation-duration: 3s;
            animation-iteration-count: 1;
            animation-direction: reverse;
            animation-delay:2s;
            animation-timing-function: linear;
            animation-fill-mode: both;
        }
        @keyframes my_animation {
            0%{
                width: 200px;
                height: 200px;
            }
            100%{
                width: 600px;
                height: 600px;
            }
        }
    </style>
</head>
<body>
<div></div>
</body>
</html>

@keyframes 動畫名{

​ //定義關鍵幀

}

  1. 關鍵幀定義時可以使用from、to、百分比
  2. from表示0%、to表示100%
  3. 可以定義很多關鍵幀。20%、30%、…
  4. 百分比其實是指的時間完成的百分比。(考慮以前學習過的歸一化的時間)

animation-timing-function可以是以下的關鍵值:

animation-timing-function: ease;
animation-timing-function: ease-in;
animation-timing-function: ease-out;
animation-timing-function: ease-in-out;
animation-timing-function: linear;
animation-timing-function: step-start;
animation-timing-function: step-end;

也可以是下面的函數:

animation-timing-function: cubic-bezier(0.1, 0.7, 1.0, 0.1);
animation-timing-function: steps(4, end);
  • cubic-bezier:貝塞爾曲線。如果提供的關鍵值不是我們想要的,則可以使用貝塞爾曲線定製自己需要的任何速度曲線。可以使用在線工具生成貝塞爾函數。

https://isux.tencent.com/css3/tools.html

例如:

cubic-bezier(0.315, -0.575, 0.680, 1.650)

對應的曲線:

  • steps(4, end): 表示每兩個關鍵幀中間共需要再填充3個關鍵幀。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章