首页 > 其他分享 >动画函数封装

动画函数封装

时间:2024-11-16 14:50:38浏览次数:3  
标签:function 动画 obj 函数 step offsetLeft var 封装

5.2.1、简单动画实现

核心原理:通过定时器setInterval()不断移动盒子位置

实现步骤:

    • 获得盒子当前位置、
    • 让盒子在当前位置上加上1个移动距离、
    • 利用定时器不断重复这个操作、
    • 加一个结束定时器的条件
    • 需要给元素加定位,利用left值变化改变元素的位置
    <!-- 需求:小盒子从左向右移动,移动到500px的地方,停下 -->
<script>
      var box = document.querySelector("div");
      var timer = setInterval(function () {
        if (box.offsetLeft === 500) {
          clearInterval(timer);
          return;
        }
        box.style.left = box.offsetLeft + 10 + "px";
      }, 30);
    </script>

5.2.2、简单动画函数封装

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>02.封装简单动画函数</title>
    <style>
      * {
        margin: 0;
        padding: 0;
      }
      div {
        width: 100px;
        height: 100px;
        background-color: #bfa;
        position: relative;
        left: 0;
      }
      span {
        background-color: pink;
        position: relative;
        left: 0;
      }
    </style>
  </head>
  <body>
    <div>动画1</div>
    <span>动画2</span>
    <!-- 封装函数,传入不同的对象,目标停止值,都可以调用动画 -->
    <script>
      function animation(obj, target) {
        var timer = setInterval(function () {
          if (obj.offsetLeft === target) {
            clearInterval(timer);
            return;
          }
          obj.style.left = obj.offsetLeft + 10 + "px";
        }, 30);
      }
      var box = document.querySelector("div");
      var s1 = document.querySelector("span");

      animation(box, 500);
      animation(s1, 300);
    </script>
  </body>
</html>

5.2.3、优化动画函数

动画函数给不同的元素记录不同定时器

如果多个元素都使用这个动画函数,每次都要var 声明定时器,我们可以给不同元素使用不同的定时器(自己用自己的定时器)

核心原理:利用js是一门动态语言,可以很方便的给当前对象添加属性

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>03.优化动画函数</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      div {
        width: 100px;
        height: 100px;
        background-color: #bfa;
        position: relative;
        left: 0;
      }
      span {
        background-color: pink;
        position: relative;
        left: 0;
      }
    </style>
  </head>
  <body>
    <div>动画1</div>
    <br />
    <button>点击按钮,执行动画函数</button><br />
    <span>动画2</span>
    <!-- 优化1:根据传入的不同对象,将timer作为属性添加给不同的对象,减少开辟的空间 -->
    <!-- 优化2:保证只有一个定时器在执行 -->
    <script>
      function animation(obj, target) {
        //在开启动画前,先关闭前一个定时器,保证只有一个定时器在执行
        clearInterval(obj.timer);
        obj.timer = setInterval(function () {
          if (obj.offsetLeft >= target) {
            clearInterval(obj.timer);
            //优化3:当达到目标值后,再点击也不会执行了
            return;
          }
          obj.style.left = obj.offsetLeft + 10 + "px";
        }, 30);
      }
      var box = document.querySelector("div");
      var s1 = document.querySelector("span");
      var btn = document.querySelector("button");

      btn.addEventListener("click", function () {
        animation(s1, 300);
      });
      animation(box, 500);
    </script>
  </body>
</html>

5.2.4、缓动效果原理

缓动动画就是让元素运动速度有所变化,最常见的是让速度慢慢停下来

思路:

让盒子每次移动的距离慢慢变小,速度就会慢慢落下来

核心算法:(目标值-现在的位置)/10 作为每次移动的距离步长

停止的条件是:让当前盒子位置等于目标位置就停止定时器

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>04.缓动画实现</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      div {
        width: 100px;
        height: 100px;
        background-color: pink;
        position: relative;
        left: 0;
      }
    </style>
  </head>
  <body>
    <button>点击按钮,执行动画函数</button><br />
    <div>动画2</div>
    <script>
      function animation(obj, target) {
        clearInterval(obj.timer);
        obj.timer = setInterval(function () {
          // 定义step,来代表每次移动的距离值,(目标值-现在的位置)/10
          var step = (target - obj.offsetLeft) / 10;
          if (obj.offsetLeft == target) {
            clearInterval(obj.timer);
            return;
          }
          obj.style.left = obj.offsetLeft + step + "px";
        }, 30);
      }

      var s1 = document.querySelector("div");
      var btn = document.querySelector("button");
      btn.addEventListener("click", function () {
        animation(s1, 500);
      });
    </script>
  </body>
</html>

5.2.5、动画函数优化

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <title>05.优化缓动动画动画函数</title>
    <style>
      * {
        padding: 0;
        margin: 0;
      }
      div {
        width: 100px;
        height: 100px;
        background-color: pink;
        position: absolute;
        left: 0;
      }
    </style>
  </head>
  <body>
    <button id="btn01">点击按钮,执行动画函数 500</button><br />
    <button id="btn02">点击按钮,执行动画函数 800</button><br />

    <div>丹洋其</div>
    <script>
      //优化三  加回调函数,可以在执行动画后,再执行其他内容
      function animation(obj, target, callback) {
        clearInterval(obj.timer);
        obj.timer = setInterval(function () {
          // 定义step,来代表每次移动的距离值
          // 优化一:对于step会涉及到小数,将小数向上取整
          // var step = Math.ceil((target - obj.offsetLeft) / 10);
          // 优化二:动画还是会涉及到往回走,如果往回走,则step会是负值,要向小取整
          var step = (target - obj.offsetLeft) / 10;
          step = step > 0 ? Math.ceil(step) : Math.floor(step);
          if (obj.offsetLeft == target) {
            clearInterval(obj.timer);
            // 如果传入了回调,则执行回调,否则,就不执行
            if (callback) {
              callback();
            }
          } else {
            // console.log(222);
            obj.style.left = obj.offsetLeft + step + "px";
          }
        }, 15);
      }

      var s1 = document.querySelector("div");
      var btn01 = document.querySelector("#btn01");
      var btn02 = document.querySelector("#btn02");

      btn01.addEventListener("click", function () {
        animation(s1, 500);
      });
      btn02.addEventListener("click", function () {
        animation(s1, 800, function () {
          alert("111");
        });
      });
    </script>
  </body>
</html>

5.2.6、animation.js文件并使用

标签:function,动画,obj,函数,step,offsetLeft,var,封装
From: https://blog.csdn.net/Aming_888/article/details/143817269

相关文章

  • localStorage和sessionStorage存储封装
    constcreateStorageProxy=(target={},type:'local'|'session')=>{conststorage=type==='local'?localStorage:sessionStorage;returnnewProxy(target,{get(obj:Record<string,any>,prop:string......
  • stoi函数介绍
    stoi是C++标准库中的一个函数,定义在头文件<string>中,它用于将字符串转换为整数类型。函数原型intstoi(conststd::string&str,size_t*idx=0,intbase=10);str(必选):要转换的字符串,必须以数字开头(可以包含正负号)。插一句题外话如果不以数字开头,会这样:idx(可......
  • [Python学习日记-67] 封装
    [Python学习日记-67]封装简介如何隐藏类中的属性封装并不是单纯意义的隐藏封装与扩展性特性(property)简介        从封装本身的意思去理解,封装就好像是拿来一个麻袋,把小猫、小狗、小王八和小猪一起装进麻袋,然后把麻袋封上口子。照这种逻辑看,封装起来的麻袋相当......
  • C++:基于红黑树封装map和set
    红黑树的修改想要用红黑树封装map和set,需要对之前实现的key-value红黑树进行修改,因为map是key-value结构而set是key结构,之前实现的红黑树不能满足需求。我们需要将key和key-value抽象统一成成一个类型T,需要修改红黑树节点类和红黑树类进行。红黑树节点enumColor{ RED, ......
  • django 数据库ORM通用的公共函数
    通用查询1、公共函数:defgeneric_query(model,filter_kwargs=None,order_by=None,limit=None,aggregate=None,annotate=None):"""通用的DjangoORM查询函数。:parammodel:Django模型类:paramfilter_kwargs:过滤条件字典:paramorder_by:......
  • 关于在Reverse函数中不能使用L=s而是*L=*s的原因分析
    完整代码地址:https://blog.csdn.net/2301_76819732/article/details/143807340?spm=1001.2014.3001.5502如果使用L=s;的话,当输出结果时,会发现内容为空。我感到很奇怪,按照我的设想,L=s;会把s指向的地址赋给L。但现在这个情况肯定是失败的了。我随便试了一试,发现如果......
  • Qt中实现旋转动画效果
    使用QPropertyAnimation类绑定对应的属性后就可以给这个属性设置对应的动画//比如自定义了属性Q_PROPERTY(introtationREADrotationWRITEsetRotation)//给这个属性加动画效果//参数1:谁要加动画效果//参数2:哪个属性加动画效果//参数3:parentm_animation=newQPr......
  • 带你0到1之QT编程:二十六、实战应用之翻转动画的实现
    此为QT编程的第二十六谈!关注我,带你快速学习QT编程的学习路线!每一篇的技术点都是很很重要!很重要!很重要!但不冗余!我们通常采取总-分-总和生活化的讲解方式来阐述一个知识点!码农不易,各位学者学到东西请点赞支持支持!开始部分:总:在开发过程中,难以避免有些高级动画的实现,例如翻......
  • 为什么 Vue3 封装 Table 组件丢失 expose 方法呢?
    在实际开发中,我们通常会将某些常见组件进行二次封装,以便更好地实现特定的业务需求。然而,在封装Table组件时,遇到一个问题:Table内部暴露的方法,在封装之后的组件获取不到。代码展示为:constMyTable=defineComponent({name:'MyTable',props:ElTable.props,emits:......
  • 仓颉_Cangjie-函数式编程
    函数定义CC语言中,函数的声明告诉编译器函数的名称、返回类型和参数列表。函数的定义则提供了函数的实际体C++返回类型函数名(参数列表){//函数体//执行的操作//返回返回类型的值}Java函数的定义分为函数的声明和函数的实现Rust使用fn关键字定义函数。函......