Maison > Article > interface Web > Résumé classique JavaScript de divers problèmes liés aux compétences sports_javascript
Les exemples de cet article résument diverses problématiques liées au sport en JavaScript. Partagez-le avec tout le monde pour votre référence. Les détails sont les suivants :
1. Divers problèmes dans le mouvement JS
Question 1 :
Code d'erreur :
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) } }
Fonctionnalités que vous espérez mettre en œuvre :
Ouvrez le minuteur, laissez div1 passer à 300 pixels, puis arrêtez div1 et éteignez le minuteur.
Erreur :
L'instruction if est fausse. Le code définit d'abord un minuteur nul, puis désactive le minuteur si la marge gauche de div1 est de 300 pixels. Sinon, continuez à avancer. Mais if n'est pas une instruction en boucle. Une fois l'instruction if exécutée une fois, elle ne sera plus exécutée. Ainsi, la minuterie n'est jamais éteinte.
Code correct :
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) }
Question 2 :
Code d'erreur :
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) }
Fonctionnalités que vous espérez mettre en œuvre :
Cliquez continuellement sur le bouton de démarrage, div1 accélérera. En effet, chaque fois que vous cliquerez sur le bouton, une minuterie sera démarrée, qui accélérera cumulativement. Par conséquent, avant de démarrer la minuterie, qu'il y ait une minuterie ou non, vous. doit d'abord éteindre la minuterie. Mais après avoir ajouté la méthode clearInterval pour fermer le minuteur, celui-ci s'accélérera toujours.
Erreur :
Mettre la variable timer dans la méthode startMove signifie que chaque fois que vous cliquez sur le bouton, la méthode startMove sera exécutée et une fermeture sera générée. Par conséquent, une minuterie locale sera créée. La minuterie de chaque fermeture ne sera donc pas partagée. Cela équivaut toujours à générer un timer de fermeture en fonction du nombre de clics.
Code correct :
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) }
Réaliser la fonction d'entrée et de sortie de la barre de partage :
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>
Obtenir la fonction de fondu d'entrée et de sortie d'image :
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>
Remarque :
1. Parce que JavaScript n'a pas d'attributs comme la marge gauche (offsetLeft) pour la transparence. Utilisez donc plutôt une variable alpha.
2. Les problèmes de compatibilité du navigateur doivent être pris en compte lors de la définition de la transparence interligne dans le code JavaScript. La méthode de configuration pour le navigateur IE est oDiv1.style.filter="aplha(opacity:" aplha ")" ;
Chrome et Firefox sont oDiv1.style.opacity=alpha/100.
Implémenter les événements de la barre de défilement :
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>
Question 1 :
La fonction que vous espérez atteindre : mise à l'échelle parallèle gratuite de trois divs parallèles.
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>
Si vous définissez uniquement une minuterie (définissez une minuterie globale) pour le mouvement de plusieurs objets, alors trois divs partagent une minuterie globale. Ensuite, lorsqu'une div ne termine pas l'action de réduction, l'autre div démarre la minuterie pour effectuer l'étirement. action. , puisque le timer est global, le timer du div précédent sera écrasé ou annulé, donc le timer précédent ne peut pas réduire complètement l'action de la nuit dernière. La solution est de définir un timer d'attribut pour chaque div.
Question 2 :
Fonctionnalités que vous espérez obtenir : Fondu entrant et sortant de plusieurs images.
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. Ce que offsetwidth obtient, c'est non seulement la largeur pure de l'objet, mais aussi la largeur et la marge de l'objet. Ensuite, dans la phrase obj.style.width=obj.offsetwidth-1 "px";, l'intention initiale est de réduire l'image à une vitesse uniforme de 1px, mais si la largeur de la bordure est définie sur 1px au lieu de 0px, alors la valeur de offsetwidth En fait, c'est la largeur de obj (remarque : ce n'est pas style.width, c'est-à-dire que ce n'est pas la largeur entre les lignes) 2. La phrase ci-dessus devient obj.style.width=obj's width 2 -1 "px" ; l'image augmente à la place. La solution n'est pas d'utiliser offsetwidth, mais d'utiliser la largeur de obj. la largeur est obtenue via la méthode getStyle.
2.La méthode getStyle obtient une chaîne. Vous devez utiliser parseint pour le convertir en un type numérique.
<!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>