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仿qq界面的折叠菜单实现代码
Dec 12 Javascript
js实现改进的仿蓝色论坛导航菜单效果代码
Sep 06 Javascript
jQuery简单创建节点的方法
Sep 09 Javascript
微信小程序 购物车简单实例
Oct 24 Javascript
vue2实现移动端上传、预览、压缩图片解决拍照旋转问题
Apr 13 Javascript
JavaWeb表单及时验证功能在输入后立即验证(含用户类型,性别,爱好...的验证)
Jun 09 Javascript
详解Angular5路由传值方式及其相关问题
Apr 28 Javascript
vue中多个倒计时实现代码实例
Mar 27 Javascript
Vue.js中的组件系统
May 30 Javascript
ES6的异步终极解决方案分享
Jul 11 Javascript
layer.msg()去掉默认时间,实现手动关闭的方法
Sep 12 Javascript
解决vue-router 嵌套路由没反应的问题
Sep 22 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
人大复印资料处理程序_输入篇
2006/10/09 PHP
下载文件的点击数回填
2006/10/09 PHP
第十一节--重载
2006/11/16 PHP
php5.4以上版本GBK编码下htmlspecialchars输出为空问题解决方法汇总
2015/04/03 PHP
网络之美 JavaScript中Get和Set访问器的实现代码
2010/09/19 Javascript
JS按位非(~)运算符与~~运算符的理解分析
2011/07/31 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
angularjs指令中的compile与link函数详解
2014/12/06 Javascript
jquery文档操作wrap()方法实例简述
2015/01/10 Javascript
jQuery插件开发的五种形态小结
2015/03/04 Javascript
JS实现图片的不间断连续滚动的简单实例
2016/06/03 Javascript
JavaScript和jquery获取父级元素、子级元素、兄弟元素的方法
2016/06/05 Javascript
bootstrap table实例详解
2017/01/06 Javascript
利用jQuery实现滑动开关按钮效果(附demo源码下载)
2017/02/07 Javascript
windows下vue-cli导入bootstrap样式
2017/04/25 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
Vue.js项目模板搭建图文教程
2017/09/20 Javascript
vue请求本地自己编写的json文件的方法
2019/04/25 Javascript
使用axios请求接口,几种content-type的区别详解
2019/10/29 Javascript
Quasar Input:type=&quot;number&quot; 去掉上下小箭头 实现加减按钮样式功能
2020/04/09 Javascript
通过JS判断网页是否为手机打开
2020/10/28 Javascript
详解Vue中的自定义指令
2020/12/07 Vue.js
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
Python实现读写INI配置文件的方法示例
2018/06/09 Python
pandas 层次化索引的实现方法
2019/07/06 Python
Pyqt5 关于流式布局和滚动条的综合使用示例代码
2020/03/24 Python
pycharm部署、配置anaconda环境的教程
2020/03/24 Python
详解Python yaml模块
2020/09/23 Python
python Matplotlib数据可视化(1):简单入门
2020/09/30 Python
CSS3文本换行word-wrap解决英文文本超过固定宽度不换行
2013/10/10 HTML / CSS
以下的初始化有什么区别
2013/12/16 面试题
教育科研先进个人材料
2014/01/26 职场文书
奥巴马英文演讲稿
2014/05/15 职场文书
2014年乡镇党建工作总结
2014/11/11 职场文书
用JS写一个发布订阅模式
2021/11/07 Javascript
介绍一下28个JS常用数组方法
2022/05/06 Javascript