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实现HTML5 Canvas六种特效滤镜示例
Jun 28 Javascript
javascript放大镜效果的简单实现
Dec 09 Javascript
javascript实现随时变化着的背景颜色
Apr 02 Javascript
JavaScript改变CSS样式的方法汇总
May 07 Javascript
jQuery时间轴插件使用详解
Jul 16 Javascript
JavaScript操作class和style样式代码详解
Feb 13 Javascript
Javascript中的数组常用方法解析
Jun 17 Javascript
简单实现jQuery进度条轮播实例代码
Jun 20 Javascript
jQuery查找节点并获取节点属性的方法
Sep 09 Javascript
利用webstrom调试Vue.js单页面程序的方法教程
Jun 06 Javascript
微信小程序登录换取token的教程
May 31 Javascript
JavaScript两种计时器的实例讲解
Jan 31 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
Destoon模板制作简明教程
2014/06/20 PHP
php实现上传图片文件代码
2015/07/19 PHP
ThinkPHP连接Oracle数据库
2016/04/22 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
Yii框架使用PHPExcel导出Excel文件的方法分析【改进版】
2019/07/24 PHP
PHP cookie与session会话基本用法实例分析
2019/11/18 PHP
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
javascript实现多级联动下拉菜单的方法
2015/02/06 Javascript
JavaScritp添加url参数并将参数加入到url中及更改url参数的方法
2015/10/26 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
JavaScript实现的微信二维码图片生成器的示例
2016/10/26 Javascript
关于Jquery中的bind(),on()绑定事件方式总结
2016/10/26 Javascript
微信小程序 设置启动页面的两种方法
2017/03/09 Javascript
Angular中ng-options下拉数据默认值的设定方法
2017/06/21 Javascript
JS实现图片手风琴效果
2020/04/17 Javascript
JS实现前端缓存的方法
2017/09/21 Javascript
bootstrap table sum总数量统计实现方法
2017/10/29 Javascript
详解Angular6.0使用路由步骤(共7步)
2018/06/29 Javascript
微信小程序canvas绘制圆角base64图片的实现
2019/08/18 Javascript
Vue解析剪切板图片并实现发送功能
2020/02/04 Javascript
Node.js API详解之 module模块用法实例分析
2020/05/13 Javascript
[02:56]DOTA2矮人直升机 英雄基础教程
2013/11/26 DOTA
[05:16]《大圣!大圣》——DOTA2新英雄齐天大圣配音李世宏老师专访
2016/12/13 DOTA
[01:03:18]DOTA2-DPC中国联赛 正赛 RNG vs Dynasty BO3 第一场 1月29日
2021/03/11 DOTA
用Python编写生成树状结构的文件目录的脚本的教程
2015/05/04 Python
Python 实现Windows开机运行某软件的方法
2018/10/14 Python
利用Python将数值型特征进行离散化操作的方法
2018/11/06 Python
Django通用类视图实现忘记密码重置密码功能示例
2019/12/17 Python
pycharm快捷键汇总
2020/02/14 Python
浅谈keras.callbacks设置模型保存策略
2020/06/18 Python
Html5饼图绘制实现统计图的方法
2020/08/05 HTML / CSS
澳大利亚领先的在线葡萄酒零售商:Get Wines Direct
2018/03/27 全球购物
英国家庭家具、照明和花园家具购物网站:Furniture123
2018/12/31 全球购物
小学教育毕业生自荐信
2013/11/18 职场文书
爱岗敬业演讲稿范文
2014/01/14 职场文书
Nginx域名转发https访问的实现
2021/03/31 Servers