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 相关文章推荐
一个不错的应用,用于提交获取文章内容,不推荐用
Mar 03 Javascript
JavaScript 入门·JavaScript 具有全范围的运算符
Oct 01 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
Sep 06 Javascript
JS实现判断碰撞的方法
Feb 11 Javascript
jQuery实现的网页右下角tab样式在线客服效果代码
Oct 23 Javascript
seajs中最常用的7个功能、配置示例
Oct 10 Javascript
新手必须知的Node.js 4个JavaScript基本概念
Sep 16 Javascript
深入理解JavaScript的值传递和引用传递
Oct 24 Javascript
layui-table对返回的数据进行转变显示的实例
Sep 04 Javascript
vue和iview实现Scroll 数据无限滚动功能
Oct 31 Javascript
mpvue网易云短信接口实现小程序短信登录的示例代码
Apr 03 Javascript
Angular进行简单单元测试的实现方法实例
Aug 16 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
基于mysql的论坛(5)
2006/10/09 PHP
PHP中判断文件存在使用is_file还是file_exists?
2015/04/03 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
JS 自动安装exe程序
2008/11/30 Javascript
jQuery之网页换肤实现代码
2011/04/30 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
2011/08/20 Javascript
jQuery增加与删除table列的方法
2016/03/01 Javascript
ES6中Generator与异步操作实例分析
2017/03/31 Javascript
Vue.js实战之利用vue-router实现跳转页面
2017/04/01 Javascript
使用react-router4.0实现重定向和404功能的方法
2017/08/28 Javascript
微信小程序实现点击导航条切换页面
2020/11/19 Javascript
Python编写简单的HTML页面合并脚本
2016/07/11 Python
python对json的相关操作实例详解
2017/01/04 Python
python常见排序算法基础教程
2017/04/13 Python
Python简单获取网卡名称及其IP地址的方法【基于psutil模块】
2018/05/24 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
解决在Python编辑器pycharm中程序run正常debug错误的问题
2019/01/17 Python
Python使用type关键字创建类步骤详解
2019/07/23 Python
解决tensorflow打印tensor有省略号的问题
2020/02/04 Python
python扫描线填充算法详解
2020/02/19 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
JavaScript+Canvas实现自定义画板的示例代码
2019/05/13 HTML / CSS
瑞典手机壳品牌:Richmond & Finch
2018/04/28 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
Java面试中常遇到的问题,也是需要注意的几点
2013/08/30 面试题
自荐信结尾
2013/10/27 职场文书
化验室技术员岗位职责
2013/12/24 职场文书
酒店采购员岗位职责
2014/03/14 职场文书
大学生创业计划书怎么写
2014/09/15 职场文书
2014镇党委书记党建工作汇报材料
2014/11/02 职场文书
少儿励志名言(80句)
2019/08/14 职场文书
经典哲理警句:志不真则心不热,心不热则功不贤
2019/11/14 职场文书
浅谈Redis在直播场景的实践方案
2021/04/27 Redis
python pygame入门教程
2021/06/01 Python
Python获取江苏疫情实时数据及爬虫分析
2021/08/02 Python
MySQL派生表联表查询实战过程
2022/03/20 MySQL