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 相关文章推荐
用JS写的一个TableView控件代码
Jan 23 Javascript
鼠标右击事件代码(asp.net后台)
Jan 27 Javascript
jQuery实现悬浮在右上角的网页客服效果代码
Oct 24 Javascript
Angular使用ng-messages与PHP进行表单数据验证
Dec 28 Javascript
ES6中Math对象新增的方法实例详解
Apr 25 Javascript
微信小程序与php 实现微信支付的简单实例
Jun 23 Javascript
基于vue2实现上拉加载功能
Nov 28 Javascript
微信小程序登录换取token的教程
May 31 Javascript
bootstrap 弹出框modal添加垂直方向滚轴效果
Jul 09 Javascript
vue中img src 动态加载本地json的图片路径写法
Apr 25 Javascript
JavaScript命令模式原理与用法实例详解
Mar 10 Javascript
js实现移动端轮播图滑动切换
Dec 21 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
jquery中实现简单的tabs插件功能的代码
2011/03/02 Javascript
Json对象与Json字符串互转(4种转换方式)
2013/03/27 Javascript
基于jQuery中对数组进行操作的方法
2013/04/16 Javascript
js获取和设置属性的方法
2014/02/20 Javascript
js身份证判断方法支持15位和18位
2014/03/18 Javascript
JQuery动态添加Select的Option元素实现方法
2016/08/29 Javascript
KnockoutJS 3.X API 第四章之数据控制流with绑定
2016/10/10 Javascript
javascript 动态脚本添加的简单方法
2016/10/11 Javascript
jQuery实现点击某个div打开层,点击其他div关闭层实例分析(阻止冒泡)
2016/11/18 Javascript
AngularJS点击添加样式、点击变色设置的实例代码
2017/07/27 Javascript
js的函数的按值传递参数(实例讲解)
2017/11/16 Javascript
使用webpack4编译并压缩ES6代码的方法示例
2019/04/24 Javascript
详解小程序开发经验:多页面数据同步
2019/05/18 Javascript
vue 解决数组赋值无法渲染在页面的问题
2019/10/28 Javascript
解决vue elementUI 使用el-select 时 change事件的触发问题
2020/11/17 Vue.js
python判断端口是否打开的实现代码
2013/02/10 Python
一个基于flask的web应用诞生 bootstrap框架美化(3)
2017/04/11 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
Python计算库numpy进行方差/标准方差/样本标准方差/协方差的计算
2018/12/28 Python
pytorch数据预处理错误的解决
2020/02/20 Python
浅谈Python中的字符串
2020/06/10 Python
python中np是做什么的
2020/07/21 Python
实例讲解HTML5的meta标签的一些应用
2015/12/08 HTML / CSS
加拿大最大的箱包及旅游配件零售商:Bentley Leathers
2017/07/19 全球购物
美国滑板店:Tactics
2020/11/08 全球购物
铭万公司.net面试题笔试题
2014/07/20 面试题
Java语言程序设计测试题判断题部分
2013/01/06 面试题
支教自我鉴定
2014/01/18 职场文书
经典洗发水广告词
2014/03/13 职场文书
工厂搬迁方案
2014/05/11 职场文书
捐款倡议书格式范文
2014/05/14 职场文书
先进班组材料范文
2014/12/25 职场文书
感恩教育观后感
2015/06/17 职场文书
《云雀的心愿》教学反思
2016/02/23 职场文书
导游词之江南周庄
2019/12/06 职场文书
从零开始在Centos7上部署SpringBoot项目
2022/04/07 Servers