完善代碼之后反而發現一個問題,你們遇到了類似的問題嗎
window.onload?=?function(){ var?li1?=?document.getElementById('li1'); li1,onmouseout?=?function(){ startMove(li1,{width:400}) } }
只改變一個屬性,加鼠標移開事件,在別的地方移動鼠標也會觸發,加上onmouseover之后也是這樣
完整代碼如下:
<!DOCTYPE> <html> <head> <meta?http-equiv="Content-Type"?content="text/html;?charset=utf-8"?/> <title>無標題</title> <style?type="text/css"> *{ margin:0; padding:0; } li{ list-style:none; height:100px; width:200px; background-color:#aaa; margin-top:20px; border:2px?solid?black; opacity:0.4; filter:alpha(opacity?=?40); position:relative; left:0; top:0; } </style> <script?type="text/javascript"> //?startMove(obj,attr,mit,fn)?attr,mit用json表示,mit<=>json[attr]; function?startMove(obj,json,fn){ clearInterval(obj.timer); //?定義flag用來檢測同時運動時是否全部完成運動,完成為true var?flag?=?true; obj.timer?=?setInterval(function(){ //?for?in?循環包含整個定時器函數 for(var?attr?in?json){ //?1,取當前值 var?icur?=0; if(attr=='opacity'){ //?360是chrome內核得到的opacity為0-100; document.title?=?parseFloat(getStyle(obj,attr)); icur?=?Math.round(parseFloat(getStyle(obj,attr))*100); }else{ icur?=?parseInt(getStyle(obj,attr)); } //?2,計算速度 //?var?speed?=?0; var?speed?=?(json[attr]-icur)/20; speed?=?speed>0?Math.ceil((json[attr]-icur)/20):Math.floor(speed); //?if(mit>icur){ //? speed?=?5; //?}else{ //? speed?=?-5; //?} //?3,檢測停止 if(json[attr]!=icur){ flag?=?false; } //?還有運動未完成, if(attr=='opacity'){ obj.style.opacity?=?(icur?+?speed)/100; obj.style.filter?=?'alpha(opacity='+?(icur?+?speed)?+')'; }else{ obj.style[attr]?=?icur?+?speed?+?'px'; } if(flag){ clearInterval(timer); if(fn){ fn(); } } } },30) } function?getStyle(obj,attr){ if(obj.currentStyle){ return?obj.currentStyle; }else{ return?getComputedStyle(obj,false)[attr]; } } </script> <script?type="text/javascript"> window.onload?=?function(){ var?li1?=?document.getElementById('li1'); li1,onmouseout?=?function(){ startMove(li1,{width:400}) } } </script> </head> <body> <ul> <li?id="li1"></li> </ul> </body> </html>
2015-12-20
2016-01-09
? if(flag){
????????????????clearInterval(timer);
????????????????if(fn){
????????????????????fn();
????????????????}
????????????}
這部分代碼要寫在for-in循環的外面,否則內調fn()會執行好幾次。