速度版运动框架

一、requestAnimationFrame
定时器做动画的缺点:有小小的误差;
请求动画帧(requestAnimationFrame):
原理:在上一个动画执行完之后开始来进行下一个动画(中间不会产生等待时间)
样式类型:API、函数体
用法:接受一个函数来作为参数来回调函数
优点:很流畅,不会产生误差;会贴合浏览器的刷新频率,不会丢帧!
异步:定时器、动画帧都是回调函数,都属于异步;事件绑定;AJAX

var num = 0;
function fn(){
  console.log( num++ );
  requestAnimationFrame( fn );
}

二、cancelAnimationFrame

var num = 0,
  animation = null;
function fn(){
  console.log(num++);
  animation = requestAnimationFrame(fn);
}
fn();
document.onclick = function(){
  cancelAnimationFrame(animation);
}

三、兼容问题
请求动画帧/清除动画帧:不兼容IE9及其以下

window.requestAnimationFrame = window.requestAnimationFrame || function(fn){
  return setTimeout(fn, 1000/60);
};
window.cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;

四、速度版运动框架
初始值:width:100px;
目标值:width:500px;
变化量:每一帧走多少步,步长,比如每一帧增加5px,直到加到500px
使用到的参数:
对象(要进行改造的内容)
对象的属性:width
对象的属性值:100px
步长:2px

window.requestAnimationFrame = window.requestAnimationFrame || function(fn){
  return setTimeout(fn, 1000/60);
};
window.cancelAnimationFrame = window.cancelAnimationFrame || clearTimeout;
var oBox = document.getElementById("box");
animation(oBox, "width", 100, 5);  //ele对象,attr属性,value属性值,step步长
function animation(ele, attr, value, step){
  var starAttr = parseFloat(getStyle(ele)[attr]),
  isDirection = starAttr > value;
  value = parseFloat(value);
  step = parseFloat(step);

/*
  初始值与目标值:
    初始值大于目标值的情况,再进行判断初始值是否小于等于目标值(步长为负)
      如果小于等于目标值,直接等于目标值
      如果不小于等于目标值,继续回调函数
    初始值小于目标值的情况,再进行判断初始值是否大于等于目标值(步长为正)
      如果大于等于目标值,直接等于目标值
      如果小于目标值,继续回调函数
*/
  if(isDirection){
    step = -step;
  }
  fn();
  function fn(){
    starAttr += step;
    if(isDirection ? starAttr <= value : starAttr >= value){
      starAttr = value;
    }else{
      requestAnimationFrame(fn);
    }
    ele.style[attr] = starAttr + "px";
   }
}
function getStyle(ele){
  return ele.currentStyle || getComputedStyle(ele);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明AI阅读 16,133评论 3 119
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 30,127评论 8 265
  • 格列佛游记概括(3) 我十分亲切和善,博得了国王和贵族们的欢心,同时也赢得了军队和老百姓的好感,我和大家的感情越来...
    垂耳_e80d阅读 116评论 0 0
  • 现在仿佛是一个全民黑郭敬明的时代,只要他犯了一点小错,被抓住一点小辫子,哪怕只是捕风捉影,也立刻会成为万千网民的狂...
    不开口的巴旦木阅读 332评论 0 0
  • 还有十天,就分手一年了,电脑里还有那年那日的聊天记录。而我们,什么都没有了。我自顾自的坚强,你自顾自的愉快。我们都...
    失宠猫阅读 586评论 0 0

友情链接更多精彩内容