美文网首页
时间版运动框架

时间版运动框架

作者: 追逐_e6cf | 来源:发表于2018-08-27 11:30 被阅读0次

一、原理:
初始宽度 100 a
目标值 宽度到 300 b
在300毫秒内到达
100毫秒的时候 ,宽度为(b-a)*(100/300) + a
匀速的时间版运动框架 => 开始的位置 + 当前时间段需要走的路程(当前时间 / 总时间 * 差值)

二、代码实现:

var oBox = document.querySelector(".box"),
  statu = 100,//宽度初始位置
  change = 500;//改变的差值
var time = 1000;//所需的时间
var statuTime = new Date();//记录开始的时间
//匿名函数自执行
(function fn(){
  //因为js代码执行非常快这里的代码是同步代码
  //取时间比例
  var now = new Date() - statuTime;//相差的毫秒值,当前代码执行到这里的时间
  now = Math.min(now, time);//谁小取谁
  //console.log(now);//当前时间的差值,当前函数执行时与开始时间的时间差
  oBox.style.width = statu + change * now / time + "px";
  //当时间的差值刚好等于终止时间时
  if(now === time){
    //不再去请求动画帧
    console.log("时间到了");
  }else{
    requestAnimationFrame(fn);//每次浏览器刷新重绘的时候开始执行 1秒大概会重绘60 理想状态大概就是16毫秒
  }
})();

三、封装

var oBox = document.querySelector(".box");
//调用
animation(oBox,{
  width : 300,
  height : 100,
  opacity : 1
},600,function(){
  //无限回调被称作回调地狱
  animation(this,{
    width : 100,
    height : 300,
    opacity : 0.5
  },600,function(){
    console.log("我不想回调了");
  });
});

//ele改变的节点 attr修改的最终属性值 time指向时间 callback回调函数
function animation(ele, attr, time, callback){
  //解决IE低版本getComputedStyle不兼容问题,返回的都是一个json对象
  var startAttr = window.getComputedStyle ? getComputedStyle(ele) : ele.currentStyle,
      start = {},//初始位置
      change = {},//差值,需要走的路程
      startTime = new Date();//开始时间
  //json对象的遍历
  for(var key in attr){
    //初始值
    var startVal = changeNum(startAttr[key]),
        changeVal = changeNum(attr[key]);
    //如果相等就不改变,只把需要改变的添加进来
    if(changeVal !=== startVal){
      start[key] = startVal;//初始值
      change[key] = changeVal - startVal;//差值
    }
  }
  //动画执行
  (function fn(){
    //时间差值
    var now = new Date() - startTime;
    //时间差值是不稳定的,要与目标时间对比
    now = Math.min(now, time);
    //for in 就是json对象的遍历和for组合使用就是循环对象
    //使用遍历来设置样式
    for(var key in change){
      //marginLeft => margin + Left
      var emAttr = ['width', 'height', 'left', 'top', 'bottom', 'right'],
          em = "";
      //test是正则的匹配方法,如果存在返回true,不存在返回false
      if(new RegExp(key, 'i').test(emAttr + "")){
        em  = "px";
      }
      ele.style[key] = start[key] + change[key] * now / time + em;
    }
    if(now === time){
      //执行回调函数
      callback && callback.call(ele);
    }else{
      //下一次浏览器重绘的时候再执行
      requestAnimationFrame(fn);
    }
  })();

}
//转化为数字
function changeNum(n){
  return parseFloat(n) || 0;
}

相关文章

  • 时间版运动框架

    一、原理:初始宽度 100 a目标值 宽度到 300 b在300毫秒内到达100毫秒的时候 ,宽度为(b...

  • 16-第十六章 运动(下)

    16-第十六章 运动(下)多值时间版运动框架结合tween.js 封装animate

  • 速度版运动框架

    一、requestAnimationFrame定时器做动画的缺点:有小小的误差;请求动画帧(requestAnim...

  • 15-第十五章 运动(中)

    15-第十五章 运动(中) 四、时间加速版运动框架 加速度 例:假如两辆汽车开始静止,均匀地加速后,达到10m/s...

  • 运动框架

    1、querySelector: 类似于getElementById。 获取出来的元素只有一个,是第一个符合条件的...

  • 运动框架

    一、JSON学习 1. 最简单的JSON示例 JSON叫做JavaScript Object Notation, ...

  • JavaScript运动框架之速度时间版本

    原文链接 http://blog.poetries.top/2017/01/12/js-animate 一、Jav...

  • 完美运动框架

    完美运动框架封装 完美运动框架调用 封装完美运动框架遇到的问题? 1.timer问题如果我们只保存一个timer变...

  • 2017.9.18运动打卡

    运动项目:哑铃版小红帽 运动时间:35分钟+拉伸 运动感受:上周运动三天,周末各种聚会,运动就没接上。今天再开始,...

  • JavaScript——运动

    一、运动框架 二、匀速运动 三、缓冲运动

网友评论

      本文标题:时间版运动框架

      本文链接:https://www.haomeiwen.com/subject/gbdziftx.html