JavaScript缓动动画函数的封装方法


Posted in Javascript onNovember 25, 2020

本文实例为大家分享了JavaScript缓动动画函数的封装代码,供大家参考,具体内容如下

本文将从封装缓动动画的以下几个部分进行封装(1、单个属性,2、多个属性,3、缓动框架之回调函数,4、缓动框架之层级与透明度)

首先:获取元素样式的兼容方式

function getStyle(ele,attr){      //获取任意类型的CSS样式的属性值
  if(window.getComputedStyle){    
    return window.getComputedStyle(ele,null)[attr];
  }
  return ele.currentStyle[attr];
}

封装单个属性

function animate(ele,attr,target){   //元素(box) 样式(left) 目标值(400)
  clearInterval(ele.timer);     //使用定时器时,先清除定时器,防止多个定时器并行
  ele.timer = setInterval(function(){
    //先定义一个当前值
    var leader = parseInt(getStyle(ele,attr)) || 0;   //当这个样式为空时设置为0,获取来的样式值要取整。
    var step = (target - leader)/10;
    step = step > 0 ? Math.ceil(step) : Math.floor(step);
    leader = leader + step;
    ele.style[attr] = leader + "px";     //注意设置元素样式,注意加单位
    if(Math.abs(target-leader) <= Math.abs(step)){
      ele.style[attr] = target + "px";
      clearInterval(ele.timer);
    }
  },25);
}

封装多个属性

function animate(ele,json){   //把样式和目标值放在json中,如:var json = {"left":10,"top":200,"width":300,"height":200}  
  clearInterval(ele.timer);
  ele.timer = setInterval(function(){
    //开闭原则,目的保证所有样式都到达目标值
    var bool = true;
    // 分别单独处理json;
    for(k in json){
      var attr = k;  //这里的k即上文中的样式
      var target = json[k];  //这里的json[k]即上文中的目标值,熟练后直接写k,json[k]。
      var leader = parseInt(getStyle(ele,attr)) || 0;
      var step = (target - leader) / 10;
      step = step > 0 ? Math.ceil(step) : Math.floor(step);
      leader = leader + step;
      ele.style[attr] = leader + "px";

      //如果使用上文中清除定时器的方式,则完成了一个json内容就清除了定时器,显然不能这么做
      // if(Math.abs(target - leader) <= Math.abs(step)){
        // ele.style[attr] = target + "px";
        // clearInterval(ele.timer);
      // }
      if(target !== leader){  //依据上文定义的bool,遍历json时当有一个样式未完成,则bool值依旧为false。
        bool = false;
      }
    }

    //只有所有属性样式都到了指定位置,bool值才变成true
    if(bool){  
      clearInterval(ele.timer);
    }
  },25);       
}

缓动框架之回调函数

function animate(ele,json,fn){
    clearInterval(ele.timer);
    ele.timer = setInterval(function(){
        var bool = true;
        for(k in json){       
            var leader = parseInt(getStyle(ele,k)) || 0;  
            var step = (json[k] - leader) / 10;
            step = step > 0 ? Math.ceil(step) : Math.floor(step);
            leader = leader + step;
            ele.style[k] = leader + "px";
            if(json[k] !== leader){
                bool = false;
            }
        }
        if(bool){
            clearInterval(ele.timer);
            if(fn){     //此处如果有函数,则掉用,如果没有则自动不执行,当然也可加个判断,if(typeof fn == "function"),当fn类型为函数时。
                fn();
            }
        }
    },25);
}

//调用
animate(box,json,function(){      //这里的function是一整个函数体,所以上文中的fn要加();
    animate(box,json1,function(){     //当执行完第一个缓动动画时,有function则继续执行。
        animate(box,json);
    });
});

缓动框架之层级与透明度

function animate(ele,json,fn){
  clearInterval(ele.timer);
  ele.timer = setInterval(function(){
    var bool = true;
    for(k in json){
      var leader;
      if(k === "opacity"){   //如果属性为opacity
        leader = getStyle(ele,k) * 100 || 1;  //不能取整,先把它乘100
      }else{
        leader = parseInt(getStyle(ele,k)) || 0;  
      }          
      var step = (json[k] - leader) / 10; 
      step = step > 0 ? Math.ceil(step) : Math.floor(step);
      leader = leader + step;
      if(k === "opacity"){ 
        ele.style[k] = leader/100;   //如果是opacity,赋值时在除以100
        ele.style.filter = "alpha(opacity="+leader+")";   //兼容IE
      }else if(k === "zIndex"){
        ele.style[k] = leader;   //直接赋值就是了,不用加单位
      }else{
        ele.style[k] = leader + "px";
      }
      if(json[k] !== leader){
        bool = false;
        console.log(leader);
      }
    }
    if(bool){
      clearInterval(ele.timer);
      if(fn){
        fn();
      }
    }
  },30);
}
**//注意这里赋值的opacity要乘以100,如:30,100等**

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery使用after()方法在元素后面添加多项内容的方法
Mar 26 Javascript
JavaScript正则表达式的分组匹配详解
Feb 13 Javascript
微信jssdk用法汇总
Jul 16 Javascript
教你如何在Node.js中使用jQuery
Aug 28 Javascript
JavaScript中关键字 in 的使用方法详解
Oct 17 Javascript
input框中的name和id的区别
Nov 16 Javascript
jQuery基于事件控制实现点击显示内容下拉效果
Mar 07 Javascript
原生js实现瀑布流布局
Mar 08 Javascript
JS实现移动端实时监听输入框变化的实例代码
Apr 12 Javascript
nginx部署访问vue-cli搭建的项目的方法
Feb 12 Javascript
Vue.js实现大转盘抽奖总结及实现思路
Oct 09 Javascript
vue实现导航菜单和编辑文本的示例代码
Jul 04 Javascript
js实现缓动动画
Nov 25 #Javascript
JavaScript实现缓动动画
Nov 25 #Javascript
Vue3配置axios跨域实现过程解析
Nov 25 #Vue.js
Vue使用Element实现增删改查+打包的步骤
Nov 25 #Vue.js
JavaScript实现网页动态生成表格
Nov 25 #Javascript
vue + el-form 实现的多层循环表单验证
Nov 25 #Vue.js
JavaScript实现HTML导航栏下拉菜单
Nov 25 #Javascript
You might like
德生PL450的电路分析和低放电路的改进办法
2021/03/02 无线电
关于PHP中的Class的几点个人看法
2006/10/09 PHP
php5 pdo新改动加载注意事项
2008/09/11 PHP
Apache 配置详解(最好的APACHE配置教程)
2010/07/04 PHP
用PHP实现 上一篇、下一篇的代码
2012/09/29 PHP
大家须知简单的php性能优化注意点
2016/01/04 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
YII2框架中behavior行为的理解与使用方法示例
2020/03/13 PHP
PHP中的输出echo、print、printf、sprintf、print_r和var_dump的示例代码
2020/12/01 PHP
JQuery 学习笔记 选择器之四
2009/07/23 Javascript
Javascript的常规数组和关联数组对比小结
2012/05/24 Javascript
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
火狐下table中创建form导致两个table之间出现空白
2013/09/02 Javascript
深入理解javascript构造函数和原型对象
2014/09/23 Javascript
jQuery使用load()方法载入另外一个网页文件内的指定标签内容到div标签的方法
2015/03/25 Javascript
jquery append 动态添加的元素事件on 不起作用的解决方案
2015/07/30 Javascript
JavaScript正则表达式匹配 div  style标签
2016/03/15 Javascript
基于BootStrap Metronic开发框架经验小结【八】框架功能总体界面介绍
2016/05/12 Javascript
js判断输入字符串是否为空、空格、null的方法总结
2016/06/14 Javascript
微信小程序 wxapp地图 map详解
2016/10/31 Javascript
解决Vue.js父组件$on无法监听子组件$emit触发事件的问题
2018/09/12 Javascript
element-ui带输入建议的input框踩坑(输入建议空白以及会闪出上一次的输入建议问题)
2019/01/15 Javascript
JS实现电脑虚拟键盘打字测试
2020/06/24 Javascript
Python+OpenCV目标跟踪实现基本的运动检测
2018/07/10 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
伦敦高达60%折扣的钻石珠宝商:Purely Diamonds
2018/06/24 全球购物
ECOSUSI官网:女式皮革背包
2019/09/27 全球购物
linux下进程间通信的方式
2014/12/23 面试题
旅游管理本科生求职信
2013/10/14 职场文书
家庭贫困证明范本(经典版)
2014/09/22 职场文书
学习党章的体会
2014/11/07 职场文书
幼儿园语言教学反思
2016/02/23 职场文书
2016年幼儿园万圣节活动总结
2016/04/05 职场文书
导游词之江南园林狮子林
2019/09/16 职场文书
java后台调用接口及处理跨域问题的解决
2022/03/24 Java/Android
Android中的Launch Mode详情
2022/06/05 Java/Android