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

yizhihongxing

当我们需要进行网页中的动画操作,很多时候会涉及到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中的this绑定规则

    一文搞懂JavaScript中的this绑定规则 一、前言 在JavaScript中,this是一个非常重要的概念,它指向的是当前函数的执行环境,它的值取决于函数的调用方式。但是由于this的规则比较复杂,经常会引起开发者的困惑,因此我们有必要详细了解JavaScript中this的工作机制和绑定规则。 二、this的指向 在JavaScript中,this…

    JavaScript 2023年6月10日
    00
  • 使用Jquery实现点击文字后变成文本框且可修改

    下面就是使用 jQuery 实现点击文字后变成文本框且可修改的完整攻略。 实现思路 选中需要被点击变为文本框的元素 给元素绑定 click 事件,点击后将其内容存储在一个变量中,并将元素变为可编辑状态的文本输入框 文本输入框失去焦点时,将新的内容存储在一个变量中,并将文本输入框变为普通的元素 示例代码 HTML 结构 <div class="…

    JavaScript 2023年6月10日
    00
  • JavaScript中Dom操作实例详解

    JavaScript中Dom操作实例详解 什么是Dom Dom,即Document Object Model,指的是文档对象模型。 它是一个用于HTML和XML文档的编程接口,可以改变或者操作文档的内容、结构和样式。 通过Dom,我们可以像操作HTML页面一样,动态地修改页面上的内容和样式,实现网页的交互和动态效果。 Dom元素的选取 通过Dom元素的选取,…

    JavaScript 2023年6月10日
    00
  • 用js来生成随机彩票号码清单

    生成随机彩票号码清单是在web开发中常遇到的问题,下面按照以下步骤来演示生成彩票号码的完整攻略: 第一步:创建HTML骨架 首先需要在HTML页面中创建一个合适的骨架。可以考虑使用以下HTML代码: <!DOCTYPE html> <html lang="en"> <head> <meta cha…

    JavaScript 2023年6月11日
    00
  • javascript实现匀速动画效果

    下面是“javascript实现匀速动画效果”的完整攻略。 什么是匀速动画 匀速动画就是指在移动过程中速度保持不变的动画。比如,一个物体从 A 点移动到 B 点,如果速度一直保持不变,则称为匀速动画。这种动画效果在一些场合会比较实用,比如模拟车辆行驶等。 实现原理 要实现匀速动画,我们需要计算出物体移动时每个单位时间的位移量。假设我们要移动的距离是 $dis…

    JavaScript 2023年6月10日
    00
  • javascript 循环调用示例介绍

    下面是关于“javascript 循环调用示例介绍”的完整攻略。 什么是循环调用? JavaScript中的循环调用指的是函数自身在执行过程中调用自己的现象,称为递归(recursion),是一种常见的算法设计思想。JavaScript中的递归一般需要终止条件来结束递归,否则会导致栈溢出。循环调用常常用于解决问题的各种算法设计,如搜索、排列、图形算法等。 示…

    JavaScript 2023年6月10日
    00
  • JavaScript SetInterval与setTimeout使用方法详解

    JavaScript SetInterval与setTimeout使用方法详解 SetInterval 语法 setInterval(function, delay, param1, param2, …) 参数 function:必需。要调用的函数或代码串。 delay:必需。该函数调用之间的时间间隔(以毫秒计)。 param1、param2和更多参数:…

    JavaScript 2023年6月10日
    00
  • Js使用WScript.Shell对象执行.bat文件和cmd命令

    JS使用WScript.shell对象可以执行bat文件和cmd命令,在实际开发过程中有很多应用场景,比如自动化脚本、批量打包、自动化测试等。 下面提供一份完整的攻略,帮助您使用JS执行bat文件和cmd命令: 1. 创建WScript.Shell对象 在开始之前,需要先创建一个 WScript.Shell对象。 示例代码: var WshShell = n…

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