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类定义例子
Sep 12 Javascript
JavaScript将当前时间转换成UTC标准时间的方法
Apr 06 Javascript
ECMAScript5(ES5)中bind方法使用小结
May 07 Javascript
Jquery使用val方法读写value值
May 18 Javascript
JS实现下拉菜单赋值到文本框的方法
Aug 18 Javascript
JavaScript实现的伸展收缩型菜单代码
Oct 14 Javascript
JavaScript操作HTML元素和样式的方法详解
Oct 21 Javascript
你所未知的3种Node.js代码优化方式
Feb 25 Javascript
jQuery ajax请求返回list数据动态生成input标签,并把list数据赋值到input标签
Mar 29 Javascript
jquery对象和DOM对象的相互转换详解
Oct 18 Javascript
解决layer 动态加载select 失效的问题
Sep 18 Javascript
vue-model实现简易计算器
Aug 17 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实现的获取网站备案信息查询代码(360)
2013/09/23 PHP
laravel框架模型和数据库基础操作实例详解
2020/01/25 PHP
基于jQuery的星级评分插件
2011/08/12 Javascript
Mac地址验证的javascript代码
2013/11/09 Javascript
js 用CreateElement动态创建标签示例
2013/11/20 Javascript
express的中间件cookieParser详解
2014/12/04 Javascript
Node.js事件驱动
2015/06/18 Javascript
JS实现点击上移下移LI行数据的方法
2015/08/05 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
微信小程序中为什么使用var that=this
2019/08/27 Javascript
vue使用i18n实现国际化的方法详解
2019/09/05 Javascript
jQuery中event.target和this的区别详解
2020/08/13 jQuery
vue项目中js-cookie的使用存储token操作
2020/11/13 Javascript
解决vue-cli输入命令vue ui没效果的问题
2020/11/17 Javascript
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
[43:43]完美世界DOTA2联赛PWL S2 LBZS vs Forest 第三场 11.29
2020/12/02 DOTA
Python进行数据科学工作的简单入门教程
2015/04/01 Python
Python中列表的一些基本操作知识汇总
2015/05/20 Python
Python自定义类的数组排序实现代码
2016/08/28 Python
python smtplib模块自动收发邮件功能(一)
2018/05/22 Python
Python pymongo模块常用操作分析
2018/09/01 Python
Python实现App自动签到领取积分功能
2018/09/29 Python
python经典趣味24点游戏程序设计
2019/07/26 Python
Python时间序列缺失值的处理方法(日期缺失填充)
2019/08/11 Python
python图像处理模块Pillow的学习详解
2019/10/09 Python
关于pycharm中pip版本10.0无法使用的解决办法
2019/10/10 Python
基于Python的身份证验证识别和数据处理详解
2020/11/14 Python
用python爬虫批量下载pdf的实现
2020/12/01 Python
CSS3近阶段篇之酷炫的3D旋转透视
2016/04/28 HTML / CSS
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
假释思想汇报范文
2014/10/11 职场文书
三潭印月的导游词
2015/02/12 职场文书
中班上学期个人总结
2015/02/12 职场文书
2016年猴年新春致辞
2015/08/01 职场文书
公司岗位说明书
2015/10/08 职场文书
golang如何去除多余空白字符(含制表符)
2021/04/25 Golang