重學css 0x4 CSS動畫

CSS中的動畫類型

  • transition補間動畫
  • keyframe關鍵幀動畫
  • 逐幀動畫

Transition 補間動畫

  • 位置——平移(left/right/margin/transform)
  • 方位——旋轉(transform)
  • 大小——縮放(transform)
  • 透明度(opacity)
  • 其他——線性變化(transform)

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .container{
            width: 100px;
            height: 100px;
            background: red;
            transition: all 1s;
            /* transition-timing-function: ease-in-out; */
            /* transition-timing-function: cubic-bezier(0.465, -0.460, 0.525, 1.435); */
            /* transition-delay: 1s; */
        }
        .container:hover{
            width: 800px;
            background:green;
        }
    </style>
</head>
<body>
    <div class="container">
    </div>
</body>
</html>

timing(easing)

  • 定義動畫進度和時間的關係 

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .container{
            width: 100px;
            height: 100px;
            background: red;
            transition: all 1s;
            transition-timing-function: ease-in-out;
            /* transition-timing-function: cubic-bezier(0.465, -0.460, 0.525, 1.435); */
            transition-delay: 1s;
        }
        .container:hover{
            width: 800px;
            background:green;
        }
    </style>
</head>
<body>
    <div class="container">
    </div>
</body>
</html>

keyframe 關鍵幀動畫

  • 相當於過個補間動畫
  • 與元素狀態的變化無關
  • 定義更加靈活

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .container{
            width: 100px;
            height: 100px;
            background: red;
            animation: run 1s linear;
            animation-direction: reverse;
            /* animation-fill-mode: forwards; */
            /* animation-iteration-count: infinite; */
            /* animation-play-state: paused; */
        }
        @keyframes run{
            0%{
                width: 100px;
            }
            50%{
                width: 800px;
            }
            100%{
                width: 100px;
            }
        }
    </style>
</head>
<body>
    <div class="container">
    </div>
</body>
</html>

逐幀動畫

  • 使用關鍵幀動畫實現
  • 適用於無法補間計算的動畫
  • 資源較大
  • 使用steps(num) num用於指定關鍵幀之間的補間幀數

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        .container{
            width: 100px;
            height: 100px;
            background: red;
            animation: run 1s linear;
            animation-direction: reverse;
            /* animation-fill-mode: forwards; */
            /* animation-iteration-count: infinite; */
            /* animation-play-state: paused; */
        }
        @keyframes run{
            0%{
                width: 100px;
            }
            50%{
                width: 800px;
            }
            100%{
                width: 100px;
            }
        }
    </style>
</head>
<body>
    <div class="container">
    </div>
</body>
</html>

補充

css動畫實現的方式有幾種

  • transition
  • keyframes(animation)

國度動畫和關鍵幀動畫的區別

  • 過度動畫需要有狀態的變化
  • 關鍵幀動畫不需要狀態變化
  • 關鍵幀動畫能控制更精細

如何實現逐幀動畫

  • 使用關鍵幀動畫
  • 使用timingfunction搭配steps去掉補間(steps(1))

CSS動畫性能

  • 性能還行
  • 部分情況下優於JS
  • JS可以做的更好,個性化控制
  • 部分高危屬性 box-shadow
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章