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 相关文章推荐
Javascript 复制数组实现代码
Nov 26 Javascript
jQuery提交多个表单的小例子
Jun 30 Javascript
Javascript表格翻页效果实现思路及代码
Aug 23 Javascript
node.js中的fs.stat方法使用说明
Dec 16 Javascript
node.js中的fs.statSync方法使用说明
Dec 16 Javascript
原生Js实现简易烟花爆炸效果的方法
Mar 20 Javascript
学习JavaScript设计模式之代理模式
Jan 12 Javascript
JavaScript 经典实例日常收集整理(常用经典)
Mar 30 Javascript
值得学习的bootstrap fileinput文件上传工具
Nov 08 Javascript
Bootstrap3下拉菜单的实现
Feb 22 Javascript
js中字符型和数值型数字的互相转化方法(必看)
Apr 25 Javascript
一篇文章让你搞懂JavaScript 原型和原型链
Nov 23 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
PHP中通过加号合并数组的一个简单方法分享
2011/01/27 PHP
Laravel框架文件上传功能实现方法示例
2019/04/16 PHP
JavaScript 读取元素的CSS信息的代码
2010/02/07 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
jQuery中:hidden选择器用法实例
2014/12/30 Javascript
js获取时间并实现字符串和时间戳之间的转换
2015/01/05 Javascript
jquery实现图片随机排列的方法
2015/05/04 Javascript
javascript发送短信验证码实现代码
2015/11/12 Javascript
基于AngularJs + Bootstrap + AngularStrap相结合实现省市区联动代码
2016/05/30 Javascript
AngularJs Forms详解及简单示例
2016/09/01 Javascript
ES6数组的扩展详解
2017/04/25 Javascript
详谈javascript精度问题与调整
2017/07/08 Javascript
JavaScript Drum Kit 指南(纯 JS 模拟敲鼓效果)
2017/07/23 Javascript
基于React+Redux的SSR实现方法
2018/07/03 Javascript
Node使用Nodemailer发送邮件的方法实现
2020/02/24 Javascript
JS实现网页时钟特效
2020/03/25 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
JavaScript中arguments的使用方法详解
2020/12/20 Javascript
OpenCV2.3.1+Python2.7.3+Numpy等的配置解析
2018/01/05 Python
对python for 文件指定行读写操作详解
2018/12/29 Python
python实现贪吃蛇游戏
2020/03/21 Python
Laravel+Dingo/Api 自定义响应的实现
2019/02/17 Python
Python Opencv任意形状目标检测并绘制框图
2019/07/23 Python
关于pymysql模块的使用以及代码详解
2019/09/01 Python
Transpose 数组行列转置的限制方式
2020/02/11 Python
python海龟绘图之画国旗实例代码
2020/11/11 Python
英国领先的NHS批准的在线药店:Pharmacy2U
2017/01/06 全球购物
思想政治教育专业个人求职信范文
2013/12/20 职场文书
工伤事故赔偿协议书
2014/04/15 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
人民调解协议书范本
2014/10/11 职场文书
体育教师个人总结
2015/02/09 职场文书
煤矿百日安全活动总结
2015/05/07 职场文书
敬老院活动感想
2015/08/07 职场文书
《围炉夜话》110句人生箴言,精辟有内涵,引人深思
2019/10/23 职场文书
python中opencv实现图片文本倾斜校正
2021/06/11 Python