js学习心得_一个简单的动画库封装tween.js

我来详细讲解“js学习心得_一个简单的动画库封装tween.js”的完整攻略。

1. 什么是Tween.js

Tween.js 是一个小巧、功能强大的 JavaScript 动画引擎库,封装了比较常见的动画算法,并且使用非常简单,方便开发者使用。Tween.js 可以用于所有支持 JavaScript 的平台。

2. 如何使用Tween.js

2.1 引入Tween.js

可以通过 npm 或者直接引入文件的方式使用Tween.js:

通过 npm 引入:

npm install tween.js --save
import TWEEN from 'tween.js';

直接引入:

<script src="https://cdnjs.cloudflare.com/ajax/libs/tween.js/18.6.4/Tween.min.js"></script>
<script>
  var tween = new TWEEN.Tween(object)
    .to(target, time)
    .easing(TWEEN.Easing.Quadratic.Out) // 使用缓动函数
    .start();
</script>

2.2 创建Tween实例

创建 Tween 实例之前,需要确定 Tween 的起始值和结束值。比如要让 div 元素从 0px 移动到 200px,我们需要确定 div 元素的样式:

div {
  position: absolute;
  left: 0;
  top: 0;
  width: 50px;
  height: 50px;
  background-color: red;
}

然后在 JavaScript 中创建 Tween 实例:

var div = document.querySelector('div');
var from = { left: 0 };
var to = { left: 200 };

// 创建 Tween 实例
var tween = new TWEEN.Tween(from)
  .to(to, 1000) // 运动时间:1000ms
  .onUpdate(() => {
    div.style.left = from.left + 'px'; // 更新 left 属性
  })
  .start(); // 开始动画

2.3 缓动函数

上面的代码中用到了缓动函数,Tween.js 提供了很多缓动函数供我们使用:

  • TWEEN.Easing.Linear.None:线性
  • TWEEN.Easing.Quadratic.In/Out/InOut:二次方
  • TWEEN.Easing.Cubic.In/Out/InOut:三次方
  • TWEEN.Easing.Quartic.In/Out/InOut:四次方
  • TWEEN.Easing.Quintic.In/Out/InOut:五次方
  • TWEEN.Easing.Sinusoidal.In/Out/InOut:正弦曲线
  • TWEEN.Easing.Exponential.In/Out/InOut:指数曲线
  • TWEEN.Easing.Circular.In/Out/InOut:圆形曲线
  • TWEEN.Easing.Elastic.In/Out/InOut:弹性曲线
  • TWEEN.Easing.Back.In/Out/InOut:超过范围的三次方

2.4 动画循环

发现动画只执行了一次,通常情况下动画需要循环执行,可以使用 Tween.js 提供的循环函数:

function animate() {
  requestAnimationFrame(animate);
  TWEEN.update();
}

// 循环动画
animate();

3. Tween.js 封装

上述代码是非常基础的 Tween.js 动画实例,但是 Tween.js 支持更多的实例:比如支持多种动画实例组合、缓动函数自定义等等。为了更加方便使用,我们可以将 Tween.js 封装成一个简单的动画库:

var demo = {
  init() {
    console.log('init');
  },
  to(el, target, time, callback) {
    var from = {};
    for (var key in target) {
      from[key] = el[key];
    }

    var tween = new TWEEN.Tween(from)
      .to(target, time)
      .onUpdate(() => {
        for (var key in from) {
          el.style[key] = from[key] + 'px';
        }
      })
      .onComplete(() => {
        callback && callback();
      })
      .start();

    return tween;
  },
  from(el, target, time, callback) {
    var from = {};
    for (var key in target) {
      from[key] = target[key];
    }

    var tween = new TWEEN.Tween(from)
      .to(el, time)
      .onUpdate(() => {
        for (var key in from) {
          el.style[key] = from[key] + 'px';
        }
      })
      .onComplete(() => {
        callback && callback();
      })
      .start();

    return tween;
  },
  tos(els, targets, time, callback) {
    var tweens = [];

    for (var i = 0; i < els.length; i++) {
      var el = els[i];
      var target = targets[i];

      var from = {};
      for (var key in target) {
        from[key] = el[key];
      }

      var tween = new TWEEN.Tween(from)
        .to(target, time)
        .onUpdate(() => {
          for (var key in from) {
            el.style[key] = from[key] + 'px';
          }
        })
        .onComplete(() => {
          callback && callback(i, el);
        })
        .start();

      tweens.push(tween);
    }

    return tweens;
  },
  remove(tween) {
    tween.stop();
    delete tween.from;
    delete tween.to;
    delete tween.valuesStart;
    delete tween.valuesEnd;
  }
};

使用 this.init() 方法初始化 Tween.js:

demo.init();

demo.to() 方法用于 Tween 单个元素,demo.from() 方法用于 Tween 元素到某个值,demo.tos() 方法用于 Tween 多个元素。

3.1 示例1:单个元素Tween

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Demo1</title>
    <style>
      div {
        position: absolute;
        left: 0;
        top: 0;
        width: 50px;
        height: 50px;
        background-color: red;
      }
    </style>
  </head>
  <body>
    <div></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/tween.js/18.6.4/Tween.min.js"></script>
    <script>
      var div = document.querySelector('div');

      demo.to(div, { left: 200 }, 1000, () => {
        demo.from(div, { left: 0 }, 1000, () => {
          console.log('动画执行完成!');
        });
      });
    </script>
  </body>
</html>

我们首先用 Tween.js 将 div 元素向右移动 200px,然后再将其移动回左侧。

3.2 示例2:多个元素Tween

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Demo2</title>
    <style>
      .box {
        position: absolute;
        left: 0;
        top: 0;
        width: 50px;
        height: 50px;
        background-color: red;
      }
    </style>
  </head>
  <body>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <div class="box"></div>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/tween.js/18.6.4/Tween.min.js"></script>
    <script>
      var els = document.querySelectorAll('.box');

      var targets = [];
      for (var i = 0; i < els.length; i++) {
        var el = els[i];
        targets.push({
          left: 200,
          top: (i + 1) * 50
        });
      }

      demo.tos(els, targets, 1000, (i, el) => {
        if (i === els.length - 1) {
          demo.tos(els, targets.reverse(), 1000, () => {
            console.log('动画执行完成!');
          });
        }
      });
    </script>
  </body>
</html>

我们首先将多个 div 元素向右移动 200px,然后再将其移动回左侧并按照层级顺序依次移动到不同的 top 段落上。

以上就是关于 Tween.js 的使用和封装的完整攻略,希望能对你有所帮助。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:js学习心得_一个简单的动画库封装tween.js - Python技术站

(0)
上一篇 2023年6月10日
下一篇 2023年6月10日

相关文章

  • js类定义函数时用prototype与不用的区别示例介绍

    当我们定义一个 JavaScript 的对象时,可以使用构造函数对其进行初始化,也可以使用 prototype 扩展对象,JavaScript 中的类的定义可以使用 prototype 与不使用 prototype 两种方式。 使用 prototype 的方式,代码可读性好,易于维护。同时可以减少对象的内存占用,避免过多的类定义,同时可以节省执行时间。 不使…

    JavaScript 2023年6月11日
    00
  • JavaScript 高级语法介绍

    JavaScript 高级语法介绍攻略 什么是 JavaScript 高级语法? JavaScript 高级语法是指相对于语言基础而言更深入、更难掌握的语言知识部分。学习 JavaScript 高级语法可以帮助开发者更加灵活地运用 JavaScript 编程语言,实现更复杂、更高级的功能。 JavaScript 高级语法包括哪些? JavaScript 高级…

    JavaScript 2023年5月18日
    00
  • js注入 黑客之路必备!

    JS注入是Web安全领域中非常重要的一个议题,也是Web攻击中常用的一种手段。攻击者可以通过JS注入攻击网站或用户,包括窃取用户信息、篡改网页内容、控制用户会话等。 以下是一个简单的JS注入攻击示例: 攻击目标 我们以一个简单的登录页面(login.html)为目标页面,该页面通过使用jQuery库将用户名和密码传递给后台验证,并在验证失败时显示错误提示。页…

    JavaScript 2023年5月19日
    00
  • JS数组Array常用方法汇总+实例

    JS数组Array常用方法汇总+实例 在JavaScript中,数组是一种非常重要的数据类型。它可以用来存储多个值,并且可以通过下标来访问和修改数组中的元素。JavaScript提供了很多常用的数组方法,可以使数组的操作更加方便快捷。下面我们就来详细讲解一下这些常用的数组方法。 一、创建数组 要创建一个数组,有多种方式: 1. 直接声明 let arr1 =…

    JavaScript 2023年5月27日
    00
  • location.hash保存页面状态的技巧

    当我们需要保存页面状态,以便于后续操作时,可以借助浏览器提供的location.hash协议来实现。下面,让我详细讲解一下“location.hash保存页面状态的技巧”的完整攻略。 什么是location.hash location.hash指的是URL中#及其后面的内容。比如,http://www.example.com/#section1中的#sect…

    JavaScript 2023年6月11日
    00
  • JavaScript 对象字面量讲解

    下面是关于JavaScript对象字面量的全面讲解: JavaScript 对象字面量讲解 JavaScript 对象是一种复合数据类型,可以包含键值对,并且可以使用点语法进行访问。对象通常用于封装相关的数据和功能,并将它们组织在一起。 对象字面量是创建 JavaScript 对象最常用的方法之一。对象字面量是使用花括号({})定义对象,每个键值对之间使用冒…

    JavaScript 2023年5月27日
    00
  • JavaScript搜索字符串并将搜索结果返回到字符串的方法

    搜索字符串并将搜索结果返回到字符串有几种方法,下面我将介绍其中两种方法。 方法一:indexOf()方法 indexOf()方法可以在一个字符串中查找指定的文本,并返回首次出现的位置。如果没有找到指定文本,则返回-1。我们可以使用它来搜索字符串。下面是一个示例: const str = ‘Hello, World!’; const searchStr = ‘…

    JavaScript 2023年5月28日
    00
  • JS简单获取当前日期时间的方法(如:2017-03-29 11:41:10 星期四)

    当我们需要在网页中展示当前日期时间的时候,可以使用JavaScript来获取当前日期时间,并以设定的格式进行展示。下面是获取当前日期时间的方法: 1. 使用Date对象的toLocaleString()方法获取当前日期时间 let now = new Date(); let year = now.getFullYear(); // 获取当前年份 let mo…

    JavaScript 2023年5月27日
    00
合作推广
合作推广
分享本页
返回顶部