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的ajax jsonp的使用解惑
Oct 09 Javascript
JQuery右键菜单插件ContextMenu使用指南
Dec 19 Javascript
js显示文本框提示文字的方法
May 07 Javascript
分离与继承的思想实现图片上传后的预览功能:ImageUploadView
Apr 07 Javascript
AngularJs学习第五篇从Controller控制器谈谈$scope作用域
Jun 08 Javascript
javascript this详细介绍
Sep 19 Javascript
原生js编写2048小游戏
Mar 17 Javascript
Vue 指令实现按钮级别权限管理功能
Apr 23 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
May 10 Javascript
浅谈Vue static 静态资源路径 和 style问题
Nov 07 Javascript
详解JavaScript中的this指向问题
Feb 05 Javascript
Web应用开发TypeScript使用详解
May 25 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
114啦源码(114la)不能生成地方房产和地方报刊问题4级页面0字节的解决方法
2012/01/12 PHP
理解PHP中的Session及对Session有效期的控制
2016/01/08 PHP
laravel ORM关联关系中的 with和whereHas用法
2019/10/16 PHP
Thinkphp 框架扩展之Widget扩展实现方法分析
2020/04/23 PHP
javascript脚本调试方法小结
2008/11/24 Javascript
js定义对象或数组直接量时各浏览器对多余逗号的处理(json)
2011/03/05 Javascript
node.js中的fs.renameSync方法使用说明
2014/12/16 Javascript
深入理解JavaScript中的for循环
2017/02/07 Javascript
详解如何在Angular中快速定位DOM元素
2017/05/17 Javascript
JavaScript实现简单的星星评分效果
2017/05/18 Javascript
解决使用vue.js路由后失效的问题
2018/03/17 Javascript
详解基于Vue,Nginx的前后端不分离部署教程
2018/12/04 Javascript
file-loader打包图片文件时路径错误输出为[object-module]的解决方法
2020/01/03 Javascript
vue过滤器实现日期格式化的案例分析
2020/07/02 Javascript
three.js着色器材质的内置变量示例详解
2020/08/16 Javascript
python实现电子词典
2020/04/23 Python
python中lambda()的用法
2017/11/16 Python
pygame实现简易飞机大战
2018/09/11 Python
pandas 条件搜索返回列表的方法
2018/10/30 Python
Python符号计算之实现函数极限的方法
2019/07/15 Python
python super的使用方法及实例详解
2019/09/25 Python
Python-for循环的内部机制
2020/06/12 Python
Python连接mysql数据库及简单增删改查操作示例代码
2020/08/03 Python
DHC中国官方购物网站:日本通信销售No.1化妆品
2016/08/20 全球购物
领先的钻石和订婚戒指零售商:Diamonds-USA
2016/12/11 全球购物
英国电器零售商:PRC Direct
2018/06/21 全球购物
C#如何调用Windows程序打开一个文档
2014/12/26 面试题
环境工程大学生自荐信
2013/10/21 职场文书
大三预备党员入党思想汇报
2014/01/08 职场文书
三月学雷锋活动总结
2014/06/26 职场文书
在校大学生自我评价范文
2014/09/12 职场文书
高中升旗仪式主持词
2015/07/03 职场文书
2019最新版股权转让及委托持股协议书范本
2019/08/07 职场文书
详解Mysql和Oracle之间的误区
2021/05/18 MySQL
springboot+VUE实现登录注册
2021/05/27 Vue.js
python数字图像处理之对比度与亮度调整示例
2022/06/28 Python