原生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日

相关文章

  • JS的Event事件对象使用方法

    下面是关于“JS的Event事件对象使用方法”的完整攻略: 一、什么是Event对象 Event对象是由浏览器创建的一个包含着当前事件所有相关信息的对象。当事件被触发时,浏览器会自动创建Event对象,并将其传递给事件处理函数。我们可以通过Event对象来获取事件的相关信息,例如事件的类型、触发元素等。 二、Event对象的常见属性和方法 1. 常见属性 e…

    JavaScript 2023年6月10日
    00
  • javascript之Partial Application学习

    JavaScript之Partial Application学习 在JavaScript中,我们经常需要使用函数来处理数据。在函数式编程中,函数通常被看作是一种“一等公民”,也就是说,函数可以像其他数据类型一样被传递、存储和操作。Partial Application是函数式编程中很重要的概念之一,本篇攻略将全面介绍Partial Application的相…

    JavaScript 2023年5月28日
    00
  • javascript的BOM汇总

    以下是“Javascript的BOM汇总”的完整攻略。 什么是BOM BOM(Browser Object Model)是指浏览器对象模型,是与浏览器窗口有关的对象的集合,它包括了窗口、地址栏、历史记录、用户代理等对象。 窗口对象 窗口对象是BOM的核心对象之一,它代表了浏览器中的一个窗口或一个标签页。我们可以通过window对象来操作当前窗口或其它窗口的属…

    JavaScript 2023年5月19日
    00
  • 深入理解JS函数的参数(arguments)的使用

    下面是深入理解JS函数参数(arguments)的使用攻略。 1. 什么是JS函数参数(arguments)? 在JS函数中,我们可以使用参数(argument)来接收外部传入的数据,这些参数被封装在一个类数组对象arguments中。arguments是代表传入函数的参数的对象,可以通过它访问函数的形参和实参。 2. arguments对象方法 argum…

    JavaScript 2023年5月27日
    00
  • JS中数组实现代码(倒序遍历数组,数组连接字符串)

    JS中数组实现代码——倒序遍历数组与数组连接字符串 在JavaScript中,数组是一种非常常用的数据类型。它可以用来存储多个数据,并且可以进行各种操作。本文将介绍如何通过JavaScript中的数组实现倒序遍历数组和数组连接字符串。 倒序遍历数组 倒序遍历数组就是按照数组中元素的倒序,依次对每个元素进行操作。在JavaScript中,我们可以使用for循环…

    JavaScript 2023年5月27日
    00
  • 浅析Javascript使用include/require

    浅析 Javascript 使用 include / require Javascript 不同于其他编程语言存在预编译及模板引入机制,因此导致在项目开发过程中可能出现一个 JS 文件需要导入其他 JS 文件中的函数或变量的情况,此时就需要使用 include 或 require 进行模块引入操作。 include 与 require include 与 r…

    JavaScript 2023年5月27日
    00
  • Bootstrap实现水平排列的表单

    实现水平排列的表单对于美化表单、提升用户体验来说非常重要。Bootstrap提供了丰富的表单样式和布局,在这里我们将结合实例讲解,展示如何使用Bootstrap实现水平排列的表单。 1. 引入Bootstrap库 首先要确保在你的网站中引入了Bootstrap的CSS和JS库,可以从官网下载后引入: <!– 引入 Bootstrap 样式文件 –&…

    JavaScript 2023年6月10日
    00
  • JS验证字符串功能

    下面我将详细讲解“JS验证字符串功能”的完整攻略。 1. 概述 在 JavaScript 中,我们可以通过正则表达式来验证字符串的合法性。正则表达式是一种强大的字符串匹配工具,它可以用来检查一个字符串是否符合某种模式。通过使用正则表达式,我们可以实现各种复杂的字符串验证功能。 2. 正则表达式的语法 正则表达式由以下几个部分组成: 字符串字面量或 RegEx…

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