Contoh dalam artikel ini meringkaskan pelbagai isu berkaitan sukan dalam JavaScript. Kongsikan dengan semua orang untuk rujukan anda. Butirannya adalah seperti berikut:
1. Pelbagai isu dalam gerakan JS
Soalan 1:
Kod ralat:
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) } }
Ciri yang anda harap dapat laksanakan:
Buka pemasa, biarkan div1 bergerak ke 300px, kemudian hentikan div1 dan matikan pemasa.
Ralat:
Pernyataan if salah Kod mula-mula menetapkan pemasa nol, dan kemudian mematikan pemasa jika jidar kiri div1 ialah 300px. Jika tidak teruskan bergerak. Tetapi jika bukan pernyataan gelung Selepas pernyataan if dilaksanakan sekali, ia tidak akan dilaksanakan lagi. Jadi pemasa tidak pernah dimatikan.
Kod yang betul:
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) }
Soalan 2:
Kod ralat:
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) }
Ciri yang anda harap dapat laksanakan:
Klik butang mula secara berterusan, div1 akan memecut Ini kerana setiap kali butang diklik, pemasa akan dimulakan, yang akan memecut secara kumulatif, sebelum memulakan pemasa, sama ada pemasa atau tidak, anda mesti Matikan pemasa satu dahulu. Tetapi selepas menambah kaedah clearInterval untuk menutup pemasa, ia masih akan mempercepatkan.
Ralat:
Meletakkan pembolehubah pemasa dalam kaedah startMove bermakna setiap kali butang diklik, kaedah startMove akan dilaksanakan dan penutupan akan dihasilkan Oleh itu, pemasa tempatan akan dibuat Pemasa dalam setiap penutupan tidak akan dikongsi, jadi Ia masih bersamaan dengan menjana pemasa penutupan untuk bilangan klik.
Kod yang betul:
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) }
Realisasikan fungsi masuk dan keluar bar perkongsian:
Kod:
<!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>
Mencapai fungsi fade-in dan fade-out gambar:
Kod:
<!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>
Nota:
1. Kerana JavaScript tidak mempunyai atribut seperti margin kiri (offsetLeft) untuk ketelusan. Jadi gunakan pembolehubah alfa sebaliknya.
2. Isu keserasian penyemak imbas perlu dipertimbangkan semasa menetapkan ketelusan antara talian dalam kod JavaScript Kaedah tetapan untuk pelayar IE ialah oDiv1.style.filter="aplha(opacity:" aplha ")";
Chrome dan Firefox ialah oDiv1.style.opacity=alpha/100.
Laksanakan acara bar skrol:
Kod:
<!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>
Soalan 1:
Fungsi yang anda harap dapat dicapai: penskalaan selari percuma bagi tiga div selari.
Kod:
<!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>
Jika anda hanya menetapkan pemasa (tetapkan pemasa global) untuk pergerakan berbilang objek, kemudian tiga div berkongsi pemasa global Kemudian apabila satu div tidak melengkapkan tindakan pengecutan, div yang lain memulakan pemasa untuk melakukan regangan action. , memandangkan pemasa adalah global, pemasa div sebelumnya akan ditimpa atau dibatalkan, jadi pemasa sebelumnya tidak dapat mengurangkan sepenuhnya tindakan malam tadi.
Soalan 2:
Ciri yang anda harap dapat dicapai: Pudar masuk dan keluar daripada berbilang gambar.
Kod:
<!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>
Kod:
<!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. Apa yang diperolehi offsetwidth bukan sahaja lebar tulen objek, tetapi juga lebar dan margin objek. Kemudian dalam ayat obj.style.width=obj.offsetwidth-1 "px";, niat asal adalah untuk mengecilkan imej pada kelajuan seragam 1px, tetapi jika lebar sempadan ditetapkan kepada 1px dan bukannya 0px, maka nilai offsetwidth Sebenarnya, ia adalah lebar obj (nota: ia bukan style.width, iaitu, ia bukan lebar antara baris) 2. Ayat di atas menjadi obj.style.width=obj's width 2 -1 "px"; imej meningkat sebaliknya. Penyelesaiannya bukan menggunakan lebar mengimbangi, tetapi menggunakan lebar obj. lebar diperoleh melalui kaedah getStyle.
2. Kaedah getStyle mendapat rentetan. Anda perlu menggunakan parseint untuk menghantarnya kepada jenis angka.
<!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>