/* 「完美運動框架」,所謂「完美」,就是能夠實現多個參數,多個物體運動互不影響的一個運動函數move()。 * 大體結構以下:運動框架 EXP: move(obj,{width:200,height:200},fnEnd) * obj: 運動物體 * json: 運動屬性和運動目標值的json集合,{'width':200,'height':200} * sv: 運動的速度,speed-value,值越小速度越大 * fnEnd: 運動結束後的回調函數 */ function move(obj, json, sv, fnEnd) { //取CSS樣式值 function getStyle(obj, attr) { if (obj.currentStyle) { return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } //運動開始 clearInterval(obj.timer); obj.timer = setInterval(function() { var isAllCompleted = true; //假設所有運動都完成了 for (attr in json) { var attrValue = 0; switch (attr) { case 'opacity': attrValue = Math.round(parseFloat(getStyle(obj, attr)) * 100); break; default: attrValue = parseInt(getStyle(obj, attr)); } //若是沒有傳入sv,則爲4 var speed = (json[attr] - attrValue) / (sv || 4); speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed); //若是循環過程當中存在還沒有結束的運動,isAllCompleted爲假 if (attrValue != json[attr]) isAllCompleted = false; switch (attr) { case 'opacity': { obj.style.filter = "alpha(opacity=" + (attrValue + speed) + ")"; obj.style.opacity = (attrValue + speed) / 100; }; break; default: obj.style[attr] = attrValue + speed + 'px'; } } //for in end! //全部循環結束後,只有當所有運動結束後(isAllCompleted=true)時才關閉定時器 if (isAllCompleted) { clearInterval(obj.timer); if (fnEnd) fnEnd(); } }, 30); } //move() end !