1. 匀速运动
1 /** 2 * @param obj - 待改变的对象 3 * @param json - 待改变的属性列表 4 * @return func - 链式调用 5 */ 6 function startMove(obj, json, func) { 7 //清除之前的定时器 8 clearInterval(obj.timer); 9 10 //开启定时器 11 obj.timer = setInterval(function() { 12 //检测是否所有动画都已完成的标识 13 var bStop = true; 14 15 //循环遍历所有要变化的属性 16 for (var attr in json) { 17 var iCur = 0; //当前值 18 var iTarget = json[attr]; //目标值 19 20 if (attr === "opacity") { 21 iCur = parseFloat(getStyle(obj, attr)) * 100; 22 } else { 23 iCur = parseInt(getStyle(obj, attr)); 24 } 25 26 //匀速运动 27 var iSpeed = 10; 28 29 if (iCur !== iTarget) { 30 //只要有一个动画未完成,就不停止定时器 31 bStop = false; 32 33 //临时结果 34 var temp = iTarget; 35 36 //防止最后越界处理 37 if (iSpeed < Math.abs(iCur - iTarget)) { 38 temp = iCur + iSpeed; 39 } 40 41 if (attr === "opacity") { 42 obj.style.filter = "alpha(opacity:" + temp + ")" 43 obj.style.opacity = temp / 100; 44 } else { 45 obj.style[attr] = temp + "px"; 46 } 47 } 48 } 49 50 //如果所有动画都已完成,则清楚定时器 51 if (bStop) { 52 clearInterval(obj.timer); 53 54 //链式调用,执行动画完成之后的动作 55 if (func) { 56 func(); 57 } 58 } 59 }, 30); 60 } 61 62 //兼容,获取对象 style 63 function getStyle(obj, attr) { 64 if (obj.currentStyle) { 65 return obj.currentStyle[attr]; 66 } else { 67 return getComputedStyle(obj, false)[attr]; 68 } 69 }
2. 缓冲(减速)运动
1 /** 2 * @param obj - 待改变的对象 3 * @param json - 待改变的属性列表 4 * @return func - 链式调用 5 */ 6 function startMove(obj, json, func) { 7 //清除之前的定时器 8 clearInterval(obj.timer); 9 10 //开启定时器 11 obj.timer = setInterval(function() { 12 //检测是否所有动画都已完成的标识 13 var bStop = true; 14 15 //循环遍历所有要变化的属性 16 for (var attr in json) { 17 var iCur = 0; //当前值 18 var iTarget = json[attr]; //目标值 19 20 if (attr === "opacity") { 21 iCur = parseFloat(getStyle(obj, attr)) * 100; 22 } else { 23 iCur = parseInt(getStyle(obj, attr)); 24 } 25 26 //减速(缓冲)运动 27 var iSpeed = (iTarget - iCur) / 8; 28 29 //防止出现小数导致误差 30 iSpeed = iSpeed > 0 ? Math.ceil(iSpeed) : Math.floor(iSpeed); 31 32 if (iCur !== iTarget) { 33 //只要有一个动画未完成,就不停止定时器 34 bStop = false; 35 36 if (attr === "opacity") { 37 obj.style.filter = "alpha(opacity:" + iCur + iSpeed + ")" 38 obj.style.opacity = (iCur + iSpeed) / 100; 39 } else { 40 obj.style[attr] = iCur + iSpeed + "px"; 41 } 42 } 43 } 44 45 //如果所有动画都已完成,则清楚定时器 46 if (bStop) { 47 clearInterval(obj.timer); 48 49 //链式调用,执行动画完成之后的动作 50 if (func) { 51 func(); 52 } 53 } 54 }, 30); 55 } 56 57 //兼容,获取对象 style 58 function getStyle(obj, attr) { 59 if (obj.currentStyle) { 60 return obj.currentStyle[attr]; 61 } else { 62 return getComputedStyle(obj, false)[attr]; 63 } 64 }