DOM 动画

动画有助于提高页面的交互性和可访问性,本章节学习使用 JavaScript 创建 HTML 动画。

动画有助于提高页面的交互性和可访问性,本章节学习使用 JavaScript 创建 HTML 动画。

一个基本的网页

为了演示如何使用 JavaScript 创建 HTML 动画,我们将使用一个简单的网页:

<!DOCTYPE html>
<html>
  <body>
    <h1>我的第一个 JavaScript 动画</h1>
  </body>
</html>

创建动画容器

所有动画都应该与容器元素相关。这里创建一个容器元素(id="container")和一个参与动画的元素(id="animate")。

<div id="container">
  <div id="animate">动画将在这里发生...</div>
</div>

容器元素应使用相对定位。动画元素应使用绝对定位。

#container {
  width: 400px;
  height: 400px;
  position: relative;
  background: yellow;
}
#animate {
  width: 50px;
  height: 50px;
  position: absolute;
  background: red;
}

动画代码

JavaScript 动画是通过对元素样式进行编程来实现的。

这些更改由计时器调用。当定时器间隔越小,动画看起来的连续性就越好。

基本代码是:

// 创建定时器间隔执行
id = setInterval(frame, 5);

function frame() {
  if (/* 测试条件 */) {
    clearInterval(id);
  } else {
    /* 更改元素样式的代码 */
  }
}

使用 JavaScript 创建完整动画

下面的代码将元素从容器的左上角移动到右下角,逻辑是:每隔 5 毫秒,top 和 left 的值就增加 1px, 直到到达右下角。

function myMove() {
  let id = null;
  const elem = document.getElementById("animate");
  let pos = 0;
  clearInterval(id);
  id = setInterval(frame, 5);
  function frame() {
    if (pos == 350) {
      clearInterval(id);
    } else {
      pos++;
      elem.style.top = pos + "px";
      elem.style.left = pos + "px";
    }
  }
}

整个例子的完整代码如下:

<!DOCTYPE html>
<html>
  <head>
    <style>
      #container {
        width: 400px;
        height: 400px;
        position: relative;
        background: yellow;
      }
      #animate {
        width: 50px;
        height: 50px;
        position: absolute;
        background: red;
      }
    </style>
  </head>
  <body>
    <h1>我的第一个 JavaScript 动画</h1>
    <div id="container">
      <div id="animate"></div>
    </div>

    <p><button onclick="myMove()">启动动画</button></p>
    <script>
      function myMove() {
        let id = null;
        const elem = document.getElementById("animate");
        let pos = 0;
        clearInterval(id);
        id = setInterval(frame, 5);
        function frame() {
          if (pos == 350) {
            clearInterval(id);
          } else {
            pos++;
            elem.style.top = pos + "px";
            elem.style.left = pos + "px";
          }
        }
      }
    </script>
  </body>
</html>