<!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>變速運動</title> <style type="text/css"> *{ margin: 0; padding: 0; } #box{ width: 100px; height: 100px; background: red; position: absolute; top: 0px; left: 0px; opacity: 1; filter: alpha(opacity=100); } </style> </head> <body> <script src="js/Tween.js" type="text/javascript" charset="utf-8"></script> <div id="box"></div> <script type="text/javascript"> var oBox = document.getElementById("box"); //調用函數,傳參 animate( oBox , {'width':300,'height':250,'top':300,'left':200,'opacity':0.4} , 2000 , 'linear' ,function(){ animate( oBox , {'width':100,'height':50,'top':100,'left':100,'opacity':0.8} , 2000 , 'linear'); } ); function animate( obj , Json , time , ev , fn ){ //判斷缺省參數,最好把參數都放到一個json中,可以隨意傳參 if( typeof time == 'undefined' ) { time = 1000; ev = 'linear'; } else if( typeof time == 'string' ) { fn = ev; ev = time; time = 1000; } else if( typeof ev == 'function' ) { fn = ev; ev = 'linear'; } else if( typeof time == 'function' ) { fn = time; ev = 'linear'; time = 1000; } ev = ev || event; //定義一個json oB來存儲運動前的初始狀態下的屬性值,即運動的初始位置 var oB = {}; for( attr in Json ) { oB[attr] = parseInt( getStyle( obj , attr ) ); } //定義一個json oC來存儲運動結束位置與當前位置的差值 var oC = {}; for( attr in Json ) { oC[attr] = Json[attr] - parseInt( getStyle( obj , attr ) ); } //獲取當前開始時間 var startTime = new Date().getTime(); clearInterval(obj.timer); //定時器,控制運動時間,時間到,清除 obj.timer = setInterval( function(){ //獲取當前時間 var nowTime = new Date().getTime(); //獲取運動過程的時間,如果超過設置的運動時間就停止 var oT = Math.min( nowTime - startTime , time ); //獲取需要運動的每個屬性 for( attr in Json ) { //屬性為透明度時 if( attr == 'opacity' ) { var iCon = Tween[ ev ]( oT , oB[attr] , oC[attr] , time ); if( isNaN( iCon ) ){ iCon = 1; }; obj.style.opacity = iCon; obj.style.filter = 'alpha(opacity = '+parseInt( (iCon*100) )+')'; } //屬性不為透明度時 else{ obj.style[attr] = Tween[ ev ]( oT , oB[attr] , oC[attr] , time ) + 'px'; } } //設置時間到,清除定時器,執行回調函數 if( oT == time ) { clearInterval( obj.timer ); fn && fn(); } },30 ) } //兼容獲取屬性的屬性值 function getStyle( obj , attr ){ return obj.currentStyle ? obj.currentStyle[attr] : getComputedStyle( obj , false )[attr]; } </script> </body> </html>