/** * Created by 张思奇 on 16/9/28. * tween.js实现补间动画 */ //使用函数的闭包包裹整个动画代码 //自运行函数 ~表示js的自动解析 浏览器看见~就会自动执行之后的函数 ~function(){ /* t timer动画已执行的时间 b begin动画执行前的起始位置 d duration动画的持续执行时间 c change动画要移动的距离(动画要变动的数值范围) 返回值 得到动画在t这个时间点需要的具体坐标(数值) * */ function linear(t,b,d,c) { return c*t/d +b; } /* * curEle 要做动画的元素 * dest 动画运动的目标值 { left:400,top:300,width:400,opacity: 0 } * duration 动画的持续时间 *{ left:400,top:300,width:400,opacity: 0 } * callback是回调函数 希望在动画结束时调用 * */ function startAnimation(curEle,dest,duration,callback) { //1.动画的初始化 计算属性的起始值 和需要改变多少值 //begin是个对象 用来保存目标属性的起始值 里面所有的属性名和dest里面的属性名对应 //change也是对象,用来保存目标属性需要变化的值,里面所有的属性名和dest里面的也对应 var begin={}, change={}; for(var key in dest) { if(dest.hasOwnProperty(key)) { begin[key] = css(curEle,key); change[key]=dest[key]-begin[key]; } } //2.启动周期定时器,定时执行移动的方法 //a.每一次动画开始之前要清除前一次动画的定时器 window.clearInterval(curEle.animTimer); //用来累计动画已经播放了多长时间 var totalTime=0; curEle.animTimer=window.setInterval(move,10); //b 定义负责每一次修改动画值的函数move function move() { totalTime+=10; //累计完时间判断是否动画结束 if(totalTime>=duration) { // for(var key in dest) // { // if(dest.hasOwnProperty(key)) // { // //把位置全都定位最终值 // css(curEle,key,dest[key]); // } // } css(curEle,dest); window.clearInterval(curEle.animTimer); if(typeof callback==="function") { callback(); } return; } //计算这个时间刻,动画需要改变的所有属性的值 for(key in dest ) { if(dest.hasOwnProperty(key)) { curPos= linear(totalTime,begin[key],duration,change[key]); css(curEle,key,curPos); } } } } window.tween=startAnimation; }();