Die Beispiele in diesem Artikel fassen verschiedene Probleme im Zusammenhang mit Sport in JavaScript zusammen. Teilen Sie es als Referenz mit allen. Die Details lauten wie folgt:
1. Verschiedene Probleme in der JS-Bewegung
Frage 1:
Fehlercode:
function startMove(){ var timer=null; var div1=document.getElementById("div1"); if (div1.offsetLeft==300){ clearInterval(timer); }else{ timer=setInterval(function(){ div1.style.left=div1.offsetLeft+10+"px"; },30) } }
Funktionen, die Sie implementieren möchten:
Öffnen Sie den Timer, lassen Sie div1 auf 300 Pixel gehen, stoppen Sie dann div1 und schalten Sie den Timer aus.
Fehler:
Die if-Anweisung ist falsch. Der Code setzt zunächst einen Null-Timer und schaltet dann den Timer aus, wenn der linke Rand von div1 300 Pixel beträgt. Ansonsten bleiben Sie in Bewegung. Aber if ist keine Schleifenanweisung. Nachdem die if-Anweisung einmal ausgeführt wurde, wird sie nicht mehr ausgeführt. Der Timer wird also nie ausgeschaltet.
Korrekter Code:
var timer=null; function startMove(){ var div1=document.getElementById("div1"); timer=setInterval(function(){ if (div1.offsetLeft==300){ clearInterval(timer); } div1.style.left=div1.offsetLeft+10+"px"; },30) }
Frage 2:
Fehlercode:
function startMove(){ var speed=1; var timer=null; var oDiv1=document.getElementById("div1"); clearInterval(timer); timer=setInterval(function(){ if (oDiv1.offsetLeft>=300){ clearInterval(timer); }else{ oDiv1.style.left=oDiv1.offsetLeft+speed+"px"; } },30) }
Funktionen, die Sie implementieren möchten:
Wenn Sie kontinuierlich auf die Startschaltfläche klicken, wird div1 beschleunigt. Dies liegt daran, dass jedes Mal, wenn Sie auf die Schaltfläche klicken, ein Timer gestartet wird, der kumulativ beschleunigt, unabhängig davon, ob ein Timer vorhanden ist oder nicht muss zuerst den einen Timer ausschalten. Aber nachdem die Methode „clearInterval“ zum Schließen des Timers hinzugefügt wurde, wird er immer noch schneller.
Fehler:
Das Einfügen der Timer-Variablen in die startMove-Methode bedeutet, dass jedes Mal, wenn auf die Schaltfläche geklickt wird, die startMove-Methode ausgeführt und ein Abschluss generiert wird. Daher wird der Timer in jedem Abschluss nicht gemeinsam genutzt Es entspricht immer noch der Generierung eines Abschluss-Timers für die Anzahl der Klicks.
Korrekter Code:
var timer=null; function startMove(){ var speed=1; var oDiv1=document.getElementById("div1"); clearInterval(timer); timer=setInterval(function(){ if (oDiv1.offsetLeft>=300){ clearInterval(timer); }else{ oDiv1.style.left=oDiv1.offsetLeft+speed+"px"; } },30) }
Realisieren Sie die Ein- und Ausstiegsfunktion der Freigabeleiste:
Code:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style type="text/css"> #div1{ width: 150px; height: 200px; background: burlywood; position: absolute; left: -150px; } span{ width: 20px; height: 60px; position: absolute; background: gold; right: -20px; top: 70px; } </style> <script> window.onload=function(){ var oDiv1=document.getElementById("div1"); oDiv1.onmouseover=function(){ move(0); }; oDiv1.onmouseout=function(){ move(-150); }; }; var timer=null; function move(target){ var oDiv1=document.getElementById("div1"); var speed=0; if (oDiv1.offsetLeft<target){ speed=10; }else{ speed=-10; } clearInterval(timer); timer=setInterval(function(){ if(oDiv1.offsetLeft==target){ clearInterval(timer); }else{ oDiv1.style.left=oDiv1.offsetLeft+speed+"px"; } },30); } </script> </head> <body> <div id="div1"> <span id="span1">分享到</span> </div> </body> </html>
Funktion zum Ein- und Ausblenden von Bildern erreichen:
Code:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> #div1{ width: 200px; height: 200px; background: red; position: absolute; filter: alpha(opacity:30); opacity: 0.3; } </style> <script> window.onload=function(){ var oDiv1=document.getElementById("div1"); oDiv1.onmouseover=function(){ move(100); }; oDiv1.onmouseout=function(){ move(30); }; }; var timer=null; var alpha=30; function move(target){ var oDiv1=document.getElementById("div1"); var speed=0; clearInterval(timer); if(alpha<target){ speed=10; }else{ speed=-10; } timer=setInterval(function(){ if (alpha==target){ clearInterval(timer); }else{ alpha+=speed; oDiv1.style.filter="alpha(opacity:"+alpha+")"; oDiv1.style.opacity=alpha/100; } },30); }; </script> </head> <body> <div id="div1"> </div> </body> </html>
Hinweis:
1. Weil JavaScript keine Attribute wie den linken Rand (offsetLeft) für Transparenz hat. Verwenden Sie stattdessen eine Alpha-Variable.
2. Beim Festlegen der Interline-Transparenz im JavaScript-Code müssen Probleme mit der Browserkompatibilität berücksichtigt werden. Die Einstellungsmethode für den IE-Browser lautet oDiv1.style.filter="aplha(opacity:" aplha ")";
Chrome und Firefox sind oDiv1.style.opacity=alpha/100.
Implementieren Sie Scrollbar-Ereignisse:
Code:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style type="text/css"> #div1{ width: 100px; height: 100px; background: yellowgreen; position: absolute; bottom: 0px; right: 0px; } </style> <script> window.onscroll=function(){ var oDiv=document.getElementById("div1"); var scrollTop=document.documentElement.scrollTop||document.body.scrollTop; move(document.documentElement.clientHeight-oDiv.offsetHeight+scrollTop); }; var timer=null; function move(target){ var oDiv=document.getElementById("div1"); clearInterval(timer); timer=setInterval(function(){ var speed=(target-oDiv.offsetTop)/10; speed=speed>0?Math.ceil(speed):Math.floor(speed); if (oDiv.offsetTop==target){ clearInterval(timer); }else{ oDiv.style.top=oDiv.offsetTop+speed+'px'; } },30) }; </script> </head> <body style="height:2000px;"> <div id="div1"></div> </body> </html>
Frage 1:
Die Funktion, die Sie erreichen möchten: kostenlose parallele Skalierung von drei parallelen Divs.
Code:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> div{ width: 100px; height: 50px; background: yellow; margin: 10px; } </style> <script> window.onload=function(){ var oDiv=document.getElementsByTagName('div'); for (var i=0;i<oDiv.length;i++){ oDiv[i].timer=null; oDiv[i].onmouseover=function(){ move(300,this); }; oDiv[i].onmouseout=function(){ move(100,this); }; } }; function move(iTarget,oDiv){ clearInterval(oDiv.timer); oDiv.timer=setInterval(function(){ var speed=(iTarget-oDiv.offsetWidth)/5; speed=speed>0?Math.ceil(speed):Math.floor(speed); if (iTarget==oDiv.offsetWidth){ clearInterval(oDiv.timer); }else{ oDiv.style.width=oDiv.offsetWidth+speed+"px"; } },30); } </script> </head> <body> <div id="div1"></div> <div id="div2"></div> <div id="div3"></div> </body> </html>
Wenn Sie nur einen Timer (einen globalen Timer) für die Bewegung mehrerer Objekte festlegen, teilen sich drei Divs einen globalen Timer. Wenn dann ein Div die Verkleinerungsaktion nicht abschließt, startet das andere Div den Timer, um die Streckung durchzuführen Da der Timer global ist, wird der Timer des vorherigen Divs überschrieben oder abgebrochen, sodass der vorherige Timer die Aktion letzte Nacht nicht vollständig reduzieren kann. Die Lösung besteht darin, für jedes Div einen Attribut-Timer festzulegen.
Frage 2:
Funktionen, die Sie erreichen möchten: Ein- und Ausblenden mehrerer Bilder.
Code:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> div{ width: 200px; height: 200px; margin: 10px; background: yellow; float: left; filter: alpha(opacity:30); opacity: 0.3; } </style> <script> window.onload=function(){ var oDiv=document.getElementsByTagName('div'); for(var i=0;i<oDiv.length;i++){ oDiv[i].timer=null; oDiv[i].alpha=30; oDiv[i].onmouseover=function(){ move(100,this); }; oDiv[i].onmouseout=function(){ move(30,this); }; } }; function move(iTarget,obj){ clearInterval(obj.timer); obj.timer=setInterval(function(){ var speed=(iTarget-obj.alpha)/30; speed=speed>0?Math.ceil(speed):Math.floor(speed); if (obj.alpha==iTarget){ clearInterval(obj.timer); }else{ obj.alpha+=speed; obj.style.filter="alpha(opacity:"+obj.alpha+")"; obj.style.opacity=obj.alpha/100; } },30); } </script> </head> <body> <div></div> <div></div> <div></div> <div></div> </body> </html>
Code:
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> div{ width: 100px; height: 100px; margin: 10px; background: yellow; float: left; border: 10px solid black; } </style> <script> window.onload=function(){ var oDiv1=document.getElementById('div1'); var oDiv2=document.getElementById('div2'); oDiv1.timer=null; oDiv2.timer=null; oDiv1.onmouseover=function(){ move(this,400,'height'); }; oDiv1.onmouseout=function(){ move(this,100,'height'); }; oDiv2.onmouseover=function(){ move(this,400,'width'); }; oDiv2.onmouseout=function(){ move(this,100,'width'); }; }; function getStyle(obj,name){ if(obj.currentStyle){ return obj.currentStyle[name]; }else{ return getComputedStyle(obj,false)[name]; } }; function move(obj,iTarget,name){ clearInterval(obj.timer); obj.timer=setInterval(function(){ var cur=parseInt(getStyle(obj,name)); var speed=(iTarget-cur)/30; speed=speed>0?Math.ceil(speed):Math.floor(speed); if(cur==iTarget){ clearInterval(obj.timer); }else{ obj.style[name]=cur+speed+"px"; } },30); }; </script> </head> <body> <div id="div1"></div> <div id="div2"></div> </body> </html>
1. Was offsetwidth erhält, ist nicht nur die reine Breite des Objekts, sondern auch die Breite und der Rand des Objekts. Dann besteht im Satz obj.style.width=obj.offsetwidth-1 "px"; die ursprüngliche Absicht darin, das Bild mit einer gleichmäßigen Geschwindigkeit von 1 Pixel zu verkleinern. Wenn die Breite des Rahmens jedoch auf 1 Pixel statt auf 0 Pixel eingestellt ist, dann ist der Wert von offsetwidth Tatsächlich ist es die Breite von obj (Hinweis: Es ist nicht style.width, das heißt, es ist nicht die Breite zwischen den Zeilen) 2. Der obige Satz wird zu obj.style.width=objs Breite 2 -1 „px“; stattdessen wird das Bild vergrößert. Die Lösung besteht nicht darin, offsetwidth zu verwenden, sondern die Breite von obj. Die Breite wird über die getStyle-Methode ermittelt.
2. Die getStyle-Methode ruft einen String ab. Sie müssen Parseint verwenden, um es in einen numerischen Typ umzuwandeln.
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> #div1{ width: 200px; height: 200px; margin: 20px; background: yellow; border: 5px solid black; filter: alpha(opacity:30); opacity: 0.3; } </style> <script> window.onload=function(){ var oDiv1=document.getElementById('div1'); oDiv1.timer=null; oDiv1.onmouseover=function(){ move(this,100,'opacity'); }; oDiv1.onmouseout=function(){ move(this,30,'opacity'); }; }; function getStyle(obj,name){ if(obj.currentStyle){ return obj.currentStyle[name]; }else{ return getComputedStyle(obj,false)[name]; } }; function move(obj,iTarget,name){ clearInterval(obj.timer); obj.timer=setInterval(function(){ var cur=0; if(name=='opacity'){ cur=Math.round(parseFloat(getStyle(obj,name))*100); }else{ cur=parseInt(getStyle(obj,name)); } var speed=(iTarget-cur)/30; speed=speed>0?Math.ceil(speed):Math.floor(speed); if(cur==iTarget){ clearInterval(obj.timer); }else{ if(name=='opacity'){ obj.style.opacity=(cur+speed)/100; obj.style.filter='alpha(opacity:'+cur+speed+')'; }else{ obj.style[name]=cur+speed+"px"; } } },30); }; </script> </head> <body> <div id="div1"></div> </body> </html>