原生JS封装animate运动框架的实例

当我们需要进行网页中的动画操作,很多时候会涉及到DOM元素的运动,比如移动、旋转、透明度变化等等。这时候,JavaScript的animate函数封装可以帮助我们更加方便地实现动画效果。

以下是原生JS封装animate运动框架的实例的完整攻略:

1. 利用JavaScript封装animate运动框架

我们首先需要使用JavaScript来封装animate运动框架,这里我们可以通过自定义一个Animate类来实现。具体代码如下:

class Animate {
  constructor(dom, options) {
    this.dom = dom; // 需要运动的DOM元素
    this.startTime = 0; // 动画开始时间
    this.startPos = 0; // 动画开始时的位置
    this.endPos = 0; // 动画结束时的位置
    this.duration = options.duration || 1000; // 动画持续时间,默认为1000ms
    this.easing = options.easing || 'linear'; // 缓动函数,默认为线性匀速
    this.callback = options.callback || function(){}; // 动画结束回调函数
  }

  // 缓动函数支持linear、ease-in、ease-out、ease-in-out等
  // 具体实现可以参考页面:http://easings.net/zh-cn
  // 以ease-in-out为例,对应的缓动函数表达式为:
  // t: current time, b: beginning value, c: change in value, d: duration
  // if ((t/=d/2) < 1) return c/2*t*t + b;
  // return -c/2 * ((--t)*(t-2) - 1) + b;
  easingSupport() {
    let easings = {
      linear(t, b, c, d) {
        return c*t/d + b;
      },
      easeInQuad(t, b, c, d) {
        return c*(t/=d)*t + b;
      },
      easeOutQuad(t, b, c, d) {
        return -c *(t/=d)*(t-2) + b;
      },
      easeInOutQuad(t, b, c, d) {
        if ((t/=d/2) < 1) return c/2*t*t + b;
        return -c/2 * ((--t)*(t-2) - 1) + b;
      }
    };
    if (!easings[this.easing]) {
      return easings['linear']; // 默认为线性匀速
    }
    return easings[this.easing];
  }

  // 开始动画
  start(endPos) {
    this.startTime = new Date().getTime();
    this.startPos = this.dom.getBoundingClientRect().left;
    this.endPos = endPos;

    let requestId;
    let update = () => {
      requestId = requestAnimationFrame(update);

      let currentPos = Math.min(this.endPos, this.startPos + (new Date().getTime() - this.startTime) / this.duration * (this.endPos - this.startPos));
      this.dom.style.transform = `translateX(${currentPos}px)`;

      if (currentPos === this.endPos) {
        cancelAnimationFrame(requestId);
        this.callback();
      }
    };

    requestId = requestAnimationFrame(update);
  }
}

以上的Animate类封装了一些常用的动画参数,包括动画运动开始时间、开始位置、结束位置、持续时间、缓动函数以及动画结束回调函数。缓动函数可以支持线性匀速以及在easings.net上面找到的其他常用缓动函数。

在start方法的实现过程中,我们使用了requestAnimationFrame方法,该方法可以在浏览器下一帧时间执行动画更新函数,避免了频繁重绘对性能的影响。

2. 使用封装的animate函数实现动画效果

在完成animate函数的封装之后,我们可以在项目中使用这个函数来实现动画效果。以下是两个动画示例的具体实现过程。

示例1:元素移动动画

在这个例子中,我们需要实现一个标题的移动动画效果,这个标题默认位于容器左侧,当鼠标移动到该容器时,标题应该从左侧缓慢划出。代码实现如下:

<style>
  .container {
    position: relative;
    height: 80px;
    overflow: hidden;
    border: 1px solid #ccc;
  }
  .title {
    position: absolute;
    left: -100px; // 初始位置在容器外部
    top: 0;
    width: 100px;
  }
</style>
<div class="container">
  <div class="title">动画标题</div>
  <div class="content">
    容器内容部分
  </div>
</div>
<script>
  let title = document.querySelector('.title');
  let container = document.querySelector('.container');
  container.addEventListener('mouseenter', ()=>{
    let animate = new Animate(title, {
      duration: 1000, // 持续时间为1s
      easing: 'easeInOutQuad', // 使用easeInOutQuad缓动函数
      callback: ()=>{
        console.log('动画结束了');
      }
    });
    animate.start(0);  // 移动到x=0的位置,即容器内部
  });
</script>

在这个例子中,我们首先需要通过CSS将标题设置为绝对定位,位于容器的左侧,初始位置为容器外部。当鼠标移动到容器上时,我们通过创建一个Animate实例来实现标题的运动效果,将标题从左侧缓慢移动到容器内部。

示例2:元素透明度变化动画

在这个例子中,我们需要实现一个图片的透明度变化动画效果。当鼠标移动到图片上时,图片的透明度应该从1变化到0,即完全消失。代码实现如下:

<style>
  .container {
    position: relative;
    width: 400px;
    height: 300px;
    border: 1px solid #ccc
  }
  img {
    width: 100%;
    height: 100%;
    opacity: 1; // 初始透明度为1
    transition: opacity 0.5s; // 使用CSS过渡
  }
</style>
<div class="container">
  <img src="example.jpg">
</div>
<script>
  let img = document.querySelector('img');
  img.addEventListener('mouseenter', ()=>{
    let animate = new Animate(img, {
      duration: 500, // 持续时间为0.5s
      easing: 'easeInOutQuad', // 使用easeInOutQuad缓动函数
      callback: ()=>{
        console.log('动画结束了');
      }
    });
    animate.start(0); // 转变为完全透明
  });
</script>

在这个例子中,我们首先需要通过CSS将图片的初始透明度设置为1,并使用CSS过渡使得透明度变化更加平滑。当鼠标移动到图片上时,我们通过创建一个Animate实例来实现图片的透明度变化效果,将透明度从1过渡到0,即完全消失。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:原生JS封装animate运动框架的实例 - Python技术站

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

相关文章

  • 基于JavaScript获取url参数2种方法

    当开发 web 应用时,我们经常需要从 URL 中获取参数。JavaScript 是一种方便快捷、实用的语言,而获取 URL 参数是 JavaScript 开发中必须面对的一个问题。本文将详细介绍两种基于 JavaScript 获取 URL 参数的方法,并提供具体的示例说明。 方法1:使用正则表达式 要从 URL 中获取参数,我们可以使用 JavaScrip…

    JavaScript 2023年6月11日
    00
  • js每隔5分钟执行一次ajax请求的实现方法

    要实现JS每隔5分钟执行一次ajax请求,可以借助JavaScript的定时器(Timer)机制,可以使用setInterval方法来周期性的调用Ajax请求的方法。下面是具体的实现步骤: 在HTML页面上引入jQuery库(或其它ajax库) <script src="https://code.jquery.com/jquery-3.5.1…

    JavaScript 2023年6月11日
    00
  • JS异步代码单元测试之神奇的Promise

    JS异步代码单元测试一直是开发人员要面对的挑战。为了解决这个问题,Promise异步编程模式被引入到JavaScript中,因其简单、灵活和可重用性而受到广泛认可。在本攻略中,我们将深入探讨如何在单元测试中使用Promise,以及如何跟踪异步代码逻辑和处理可能的异步回调。 异步单元测试面临的问题 在传统的单元测试中,我们可以通过直接调用函数、对函数输出结果进…

    JavaScript 2023年5月28日
    00
  • js读写json文件实例代码

    当我们需要读写JSON文件时,我们可以使用Node.js中的fs模块进行操作。下面是使用Node.js读写JSON文件的两个示例: 示例一:读取JSON文件 首先,在JavaScript文件的开头引入 fs 模块,并使用 fs.readFileSync()方法读取JSON文件: const fs = require(‘fs’); const data = f…

    JavaScript 2023年5月27日
    00
  • JavaScript中子对象访问父对象的方式详解

    下面我来详细讲解“JavaScript中子对象访问父对象的方式详解”。 1. 使用this关键字 在JavaScript中,this关键字表示当前对象。使用this关键字可以访问当前对象的属性和方法,也可以通过this关键字访问当前对象的父对象。假设我们有一个如下的对象,其中包含子对象: let parentObj = { name: "父对象&q…

    JavaScript 2023年5月27日
    00
  • FCKeditor 和 SyntaxHighlighter 代码高亮插件的整合

    下面是关于“FCKeditor 和 SyntaxHighlighter 代码高亮插件的整合”的详细攻略。 概述 首先我们要理解这两个插件是什么。FCKeditor是一个基于Web的WYSIWYG文本编辑器,可以方便地进行文本排版,支持多种格式,具有图形用户界面。而SyntaxHighlighter是一个代码高亮插件,可以让我们方便地将代码高亮显示,并可以自定…

    JavaScript 2023年6月11日
    00
  • javascript创建函数的20种方式汇总

    首先,我们需要明确“JavaScript创建函数的20种方式”是指通过不同的方法来创建JavaScript函数。下面将介绍其中的20种方式。 1.使用函数声明方式 函数声明方式就是使用function关键字来声明和定义函数。例如: function myFunction() { //函数体 } 2.使用函数表达式方式 函数表达式方式是使用函数字面量来创建函数…

    JavaScript 2023年5月27日
    00
  • 详解JavaScript 中 if / if…else…替换方式

    下面我将详细讲解“详解JavaScript中if/if…else…替换方式”的完整攻略。 一、背景介绍 在JavaScript编程中,常用的逻辑判断方式是if语句和if…else语句。然而,当判断条件多且复杂时,使用if语句或if…else语句显得比较繁琐。为了解决这个问题,我们可以采用一些替换方式来简化代码的书写,并且使其更易懂。 二、替换…

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