欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

JavaScript变速动画函数封装添加任意多个属性

程序员文章站 2022-05-27 09:07:43
下面通过实例代码给大家介绍javascript变速动画函数封装添加任意多个属性 ,具体代码如下所示:

下面通过实例代码给大家介绍javascript变速动画函数封装添加任意多个属性 ,具体代码如下所示:

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <title></title>
  <style>
    * {
      margin: 0;
      padding: 0;
    }
    div {
      width: 200px;
      height: 100px;
      background-color: pink;
      position: absolute;
    }
  </style>
</head>
<body>
<input type="button" id="bt" value="显示效果"/>
<div id="dv"></div>
<script src="common.js"></script>
<script>
  //点击按钮,使元素的宽度到达一个值,高度到达一个值
  //获取任意元素的任意属性值
  function getstyle(element, attr) {
    //判断浏览器是否支持这个方法
    return window.getcomputedstyle ? window.getcomputedstyle(element, null)[attr] : element.currentstyle[attr] || 0;
  }
  //使任意元素,改变多个值的大小
  function animate(element, json) {
    //清理定时器
    clearinterval(element.timeid);
    //创建定时器
    element.timeid = setinterval(function () {
      //默认全部到达目标
      var flag = true;
      //循环遍历要改变的属性和值
      for (var attr in json) {
        //过去该属性的当前的值
        var current = parseint(getstyle(element, attr));
        //当前属性对应的目标值
        var target = json[attr];
        //移动的步数
        var step = (target - current) / 10;
        step = step > 0 ? math.ceil(step) : math.floor(step);
        current += step;//移动后的值
        element.style[attr] = current + "px";
        if (current != target) {
          flag = false;
        }
      }
      if (flag) {
        //清理定时器
        clearinterval(element.timeid);
      }
      //测试代码
      console.log("目标:" + target + ",当前:" + current + ",每次的移动步数:" + step);
    }, 20)
  }
  my$("bt").onclick = function () {
    animate(my$("dv"), {"width": 300, "left": 100, "top": 50});
  };
</script>
</body>
</html>

common.js:

/**
 * created by administrator on 2018/8/18.
 */
/**
 * created by administrator on 2016/7/27.
 */
/**
 * created by administrator on 2016/7/21.
 *
 * 次文件来自 很牛x的程序员 .
 *
 * 作者:无名
 */
/*
 * 该函数是返回的是指定格式的日期,是字符串类型
 * 参数:date ----日期
 * 返回值: 字符串类型的日期
 * */
function getdatetostring(date) {
  var strdate;//存储日期的字符串
  //获取年
  var year = date.getfullyear();
  //获取月
  var month = date.getmonth() + 1;
  //获取日
  var day = date.getdate();
  //获取小时
  var hour = date.gethours();
  //获取分钟
  var minute = date.getminutes();
  //获取秒
  var second = date.getseconds();
  hour = hour < 10 ? "0" + hour : hour;
  minute = minute < 10 ? "0" + minute : minute;
  second = second < 10 ? "0" + second : second;
  //拼接
  strdate = year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + second;//隐藏问题,关于变量声明的位置
  return strdate;
}
//根据id获取元素对象
function my$(id) {
  return document.getelementbyid(id);
}
/*
 *
 * innertext属性ie中支持
 * textcontent火狐中支持
 * dvobj.innertext="您好";设置innertext的值
 * console.log(dvobj.innertext);获取innertext的值
 * 因为上述原因,inertext有时候需要设置值,有时候需要获取值
 * 所以,需要写一个兼容的代码能在火狐中使用,也可以在ie中使用
 *
 *
 * */
/*
 *设置innertext属性的值
 * element-----为某个元素设置属性值
 * content-----设置的值
 * */
function setinnertext(element, content) {
  if (typeof element.textcontent === "undefined") {
    //ie浏览器
    element.innertext = content;
  } else {
    element.textcontent = content;
  }
}
/*
 * 获取innertext属性的值
 * element 要获取的元素
 * 返回的是该元素的innertext值
 * */
function getinnertext(element) {
  if (typeof element.textcontent === "undefined") {
    //ie浏览器
    return element.innertext;
  } else {
    return element.textcontent;
  }
}
//获取当前元素前一个元素
function getpreviouselement(element) {
  if (element.previouselementsibling) {
    return element.previouselementsibling;
  } else {
    var ele = element.previoussibling;
    while (ele && ele.nodetype !== 1) {
      ele = ele.previoussibling;
    }
    return ele;
  }
}
//获取当前元素的后一个元素
function getnextelement(element) {
  if (element.nextelementsibling) {
    return element.nextelementsibling;
  } else {
    var ele = element.nextsibling;
    while (ele && ele.nodetype !== 1) {
      ele = ele.nextsibling;
    }
    return ele;
  }
}
//获取父元素中的第一个元素
function getfirstelementbyparent(parent) {
  if (parent.firstelementchild) {
    return parent.firstelementchild;
  } else {
    var ele = parent.firstchild;
    while (ele && ele.nodetype !== 1) {
      ele = ele.nextsibling;
    }
    return ele;
  }
}
//获取父元素中的最后一个元素
function getlastelementbyparent(parent) {
  if (parent.lastelementchild) {
    return parent.lastelementchild;
  } else {
    var ele = parent.lastchild;
    while (ele && ele.nodetype !== 1) {
      ele = ele.previoussibling;
    }
    return ele;
  }
}
//获取兄弟元素
function getsiblings(ele) {
  if (!ele)return;//判断当前的ele这个元素是否存在
  var elements = [];//定义数组的目的就是存储当前这个元素的所有的兄弟元素
  var el = ele.previoussibling;//当前元素的前一个节点
  while (el) {
    if (el.nodetype === 1) {//元素
      elements.push(el);//加到数组中
    }
    el = el.previoussibling;
  }
  el = ele.nextsibling;
  while (el) {
    if (el.nodetype === 1) {
      elements.push(el);
    }
    el = el.nextsibling;
  }
  return elements;
}
//  //能力检测多个浏览器为同一个对象注册多个事件
var eventtools = {
  //为对象添加注册事件
  addeventlistener: function (element, eventname, listener) {
    if (element.addeventlistener) {
      element.addeventlistener(eventname, listener, false);
    } else if (element.attachevent) {
      element.attachevent("on" + eventname, listener)
    } else {
      element["on" + eventname] = listener;
    }
  },
  //为对象移除事件
  removeeventlistener: function (element, eventname, listener) {
    if (element.removeeventlistener) {
      element.removeeventlistener(eventname, listener, false);
    } else if (element.detachevent) {
      element.detachevent("on" + eventname, listener);
    } else {
      element["on" + eventname] = null;
    }
  },
  //获取参数e
  getevent: function (e) {
    return e || window.event;
  },
  getpagex: function (e) {
    if (e.pagex) {
      return e.pagex;
    } else {
      //有的浏览器把高度设计在了文档的第一个元素中了
      //有的浏览器把高度设计在了body中了
      //document.documentelement.scrolltop;//文档的第一个元素
      //document.body.scrolltop;
      var scrollleft = document.documentelement.scrollleft || document.body.scrollleft;
      return e.clientx + scrollleft;
    }
  },
  getpagey: function (e) {
    if (e.pagey) {
      return e.pagey;
    } else {
      var scrolltop = document.documentelement.scrolltop || document.body.scrolltop;
      return e.clienty + scrolltop;
    }
  }
};

补充:js 变速动画函数

//获取任意一个元素的任意一个属性的当前的值---当前属性的位置值
  function getstyle(element, attr) {
    return window.getcomputedstyle ? window.getcomputedstyle(element, null)[attr] : element.currentstyle[attr] || 0;
  }

//变速动画函数封装增加任意多个属性和回调函数及层级还有透明度
  //element元素 json对象 存储属性与值 fn为回调函数
  function animate(element, json, fn) {
    //清理定时器
    clearinterval(element.timeid);
    //设置定时器
    element.timeid = setinterval(function () {
      //假设全部到达目标
      var f = true;
      //循环去获取传入的数据
      for (var i in json) {
        //判断传入的值 是不是opacity
        if (i == 'opacity') {
          //获取当前opacity的值 并且放大100倍
          var current = getstyle(element, i) * 100;
          //把目标值也放大100倍
          var target = json[i] * 100;
          //移动的步数
          var step = (target - current) / 10;
          //判断是不是为0
          step = step > 0 ? math.ceil(step) : math.floor(step);
          //移动后的位置
          current += step;
          //移动元素属性
          element.style[i] = current / 100;
          //判断属性是不是zindex
        } else if (i == 'zindex') {
          //直接设置zindex
          element.style[i] = json[i];
        } else {
          //普通属性获取(转化成数字)
          var current = parseint(getstyle(element, i));
          //目标属性值
          var target = json[i]
          //移动的步骤(渐变)
          var step = (target - current) / 10;
          //判断移动的值取整
          step = step > 0 ? math.ceil(step) : math.floor(step);
          //移动后的位置
          current += step;
          //移动元素
          element.style[i] = current + 'px';
        }
        //只要有一个没达到目标就设置f为false
        if (current != target) {
          f = false;
        }
        //目标到达 清理定时器 判断有没有回调函数
        if (f) {
          clearinterval(element.timeid);
          if (fn) {
            fn();
          }
        }
      }
      console.log("目标:" + target + ",当前:" + current + ",每次的移动步数:" + step);
    }, 20)
  }

总结

以上所述是小编给大家介绍的javascript变速动画函数封装添加任意多个属性,希望对大家有所帮助