js动画相关函数的封装

/**
 * 获取滚动的距离,并做兼容性处理
 * @returns {{top: number, left: number}}  返回JSON数据top,left
 */
function scroll() {
  if (window.pageYOffset !== null) {
    return {
      top : window.pageYOffset,
      left: window.pageXOffset
    }
  } else if (document.compatMode === 'CSS1Compat') {
    return {
      top: document.documentElement.scrollTop,
      left: document.documentElement.scrollLeft
    }
  } else {
    return {
      top: document.body.scrollTop,
      left: document.body.scrollLeft
    }
  }
}

/**
 * 获取指定元素
 * @param id
 * @returns {any}
 */
function $(id) {
  return typeof id === 'string' ? document.getElementById(id) : null;
}

/**
 * 获取可视窗口的大小,兼容性
 * @returns {{w: number, h: number}}
 */
function getViewportOffset() {
  if (window.innerWidth) {
    return {
      w: window.innerWidth,
      h: window.innerHeight
    }
  } else {
    if (document.compatMode === "BackCompat") {
      return {
        w: document.body.clientWidth,
        h: document.body.clientHeight
      }
    } else {
      return {
        w: document.documentElement.clientWidth,
        h: document.documentElement.clientHeight
      }
    }
  }
}

/**
 * 匀速动画函数
 * @param {object}ele
 * @param {number}target
 * @param {number}speed
 */
function constant(ele, target, speed = 60) {
  // 1.清除定时器
  clearInterval(ele.timer);

  // 2.判断方向
  let dir = ele.offsetLeft < target ? speed : -speed;

  // 3.设置定时器
  ele.timer = setInterval(function () {
    ele.style.left = ele.offsetLeft + dir + 'px';

    if(Math.abs(target - ele.offsetLeft) <= speed) {
      clearInterval(ele.timer);
      ele.style.left = target + 'px';
    }
  }, speed)
}

/**
 * 获取css的样式值
 * @param {object}obj
 * @param attr
 * @returns {*}
 */
function getCSSAttrValue(obj, attr) {
  if(obj.currentStyle){ // IE 和 opera
    return obj.currentStyle[attr];
  }else {
    return window.getComputedStyle(obj, null)[attr];
  }
}

/**
 * 缓动动画
 * @param obj
 * @param json
 * @param fn
 */
function buffer(obj, json, fn) {
  // 1.1 清除定时器
  clearInterval(obj.timer);

  // 1.2 设置定时器
  var begin = 0, target = 0, speed = 0;
  obj.timer = setInterval(function () {
    // 1.3.0 旗帜
    var flag = true;
    for(var k in json){
      // 1.3 获取初始值
      if("opacity" === k){ // 透明度
        begin =  Math.round(parseFloat(getCSSAttrValue(obj, k)) * 100) || 100;
        target = parseInt(json[k] * 100);
      }else if("scrollTop" === k){
        begin = Math.ceil(obj.scrollTop);
        target = parseInt(json[k]);
      }else { // 其他情况
        begin = parseInt(getCSSAttrValue(obj, k)) || 0;
        target = parseInt(json[k]);
      }

      // 1.4 求出步长
      speed = (target - begin) * 0.2;

      // 1.5 判断是否向上取整
      speed = (target > begin) ? Math.ceil(speed) : Math.floor(speed);

      // 1.6 动起来
      if("opacity" === k){ // 透明度
        // w3c的浏览器
        obj.style.opacity = (begin + speed) / 100;
        // ie 浏览器
        obj.style.filter = 'alpha(opacity:' + (begin + speed) +')';
      }else if("scrollTop" === k){
        obj.scrollTop = begin + speed;
      }else {
        obj.style[k] = begin + speed + "px";
      }

      // 1.5 判断
      if(begin !== target){
        flag = false;
      }
    }

    // 1.3 清除定时器
    if(flag){
      clearInterval(obj.timer);

      console.log(fn);

      // 判断有没有回调函数
      if(fn){
        fn();
      }
    }
  }, 20);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值