CSS动画及优化(附链接)

508 阅读2分钟

CSS 动画

一、动画的定义

  • 许多静止的画面以一定的速度(如每秒 30 张)连续播放(FPS 就是 30 了)。

而我们肉眼因视觉残象产生错觉误以为是活动的画面。(这就是人脑的 BUG 吗?i 了 i 了)

  • 帧:每个静止的画面。

二、CSS 动画

那么我们用 CSS 如何实现呢?

一个简单的例子:将一个 div 盒子从左向右移动


PS:我不知道如何上传视频演示,下面的演示也是一样。请知道如何上传视频的小伙伴留言告诉下我。我好修改。

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>CSS动画</title>
    <style>
      .flash {
        position: absolute;
        left: 0;
        top: 0;
        width: 100px;
        height: 100px;
        border: 1px solid red;
        margin: 100px;
      }
    </style>
  </head>
  <body>
    <div class="flash"></div>
    <script>
      let div = document.querySelector(".flash");
      let distance = 0;
      var timer = setInterval(() => {
        if (distance <= 400) {
          div.style.left = distance + "px";
          distance += 10;
        } else {
          clearInterval(timer);
        }
      }, 100);
    </script>
  </body>
</html>

三、前端做动画的两种方法(高手都不用改变 left 的形式做)

  • transition

  • animation


1.transition 做法

作用:用于过渡,补充中间帧

    语法格式

    transition : 属性名1 时长 过渡方式 延迟, 属性名2 时长 过渡方式 延迟 ......

过渡方式: linear | ease | ease-in | ease-out | cubic-bezier | step-start | step-end | steps

属性名: all | none | 或者是像单个 width、heght 的属性


同样的例子用 transition 实现

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8" />
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  <title>CSS动画</title>
  <style>
    .flash {
      position: absolute;
      top: 0;
      left: 0;
      width: 100px;
      height: 100px;
      border: 1px solid red;
      margin: 100px;
      transition: all 1s;
    }
  </style>
</head>
<body>
  <div class="flash"></div>
  <button>点击开始</button>
  <script>
    var div = document.querySelector(".flash");
    var btn = document.querySelector("button");
    btn.onclick = () => {
      div.style.left = "400px";
    };
  </script>
</body>
</html>

2、animation 做法:

作用:css 设置的一个专门做动画的东西

    语法格式:

    ①声明关键帧:@keyframes 动画名{}

        写法1from to

            @keyframes 动画名{
                from{
                    /*代码块*/
                }
                to{
                    /*代码块*/
                }
            }

        写法2(最常用):百分数

            @keyframes 动画名{
                0% {
                     /*代码块*/
                }
                50% {
                     /*代码块*/
                }
                60%,78%{
                     /*代码块*/
                }
                100% {
                     /*代码块*/
                }
            }

    ②animation: 动画名 | 时长 | 过渡方式 | 延迟 | 次数 | 方向 | 填充模式 | 是否暂停

过渡方式: 同 transition 一样

次数: 3 | 2.4 | Infinite 方向: reverse | alternate (来回折返) | alternate-reverse

填充模式(控制动画最后一帧停在哪儿): none | forwards | backwards | both

是否暂停: paused | running

注:以上属性都可以单独列出来(即可通过 JS 代码来修改)

div.style.animationPlayState = "paused";

同样的例子用 animation 实现

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>CSS动画</title>
    <style>
      .flash {
        width: 100px;
        height: 100px;
        border: 1px solid red;
        margin: 100px;
        animation: move_div 1s forwards;
      }
      @keyframes move_div {
        0% {
          transform: none;
        }
        100% {
          transform: translateX(300px);
        }
      }
    </style>
  </head>
  <body>
    <div class="flash"></div>
  </body>
</html>

四、动画的优化

---------传送门