ホームページ >ウェブフロントエンド >jsチュートリアル >sports_javascript スキルに関連するさまざまな問題の JavaScript クラシックの概要
この記事の例では、JavaScript のスポーツに関連するさまざまな問題を要約しています。皆さんの参考に共有してください。詳細は以下の通りです。
1. JS の動作におけるさまざまな問題
質問 1:
エラーコード:
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) } }
実装を希望する機能:
タイマーを開き、div1 を 300px に移動させてから、div1 を停止してタイマーをオフにします。
エラー:
if ステートメントが間違っています。コードは最初に null タイマーを設定し、次に div1 の左マージンが 300px の場合にタイマーをオフにします。それ以外の場合は動き続けてください。ただし、if はループ文ではありません。if 文は一度実行されると実行されなくなります。したがって、タイマーがオフになることはありません。
正しいコード:
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) }
質問 2:
エラーコード:
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) }
実装を希望する機能:
スタートボタンをクリックし続けると、div1 が加速します。これは、ボタンをクリックするたびにタイマーが開始され、累積的に加速するためです。したがって、タイマーの有無に関係なく、タイマーを開始する前に、まずワンタイマーをオフにする必要があります。ただし、タイマーを閉じるために clearInterval メソッドを追加した後でも、速度は向上します。
エラー:
startMove メソッドにタイマー変数を入れると、ボタンがクリックされるたびに startMove メソッドが実行され、クロージャーが生成されることになります。そのため、各クロージャー内のタイマーは共有されません。これは、クリック数に対する終了タイマーを生成することと同じです。
正しいコード:
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) }
共有バーの入口と出口機能を実現します:
コード:
<!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>
画像のフェードインおよびフェードアウト機能を実現します:
コード:
<!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>
注:
1. JavaScript には左マージン (offsetLeft) のような透明度の属性がないためです。したがって、代わりにアルファ変数を使用してください。
2. JavaScript コードで行間の透明度を設定する場合は、ブラウザの互換性の問題を考慮する必要があります。IE ブラウザの設定方法は oDiv1.style.filter="aplha(opacity:" aplha ")"; です。
Chrome と Firefox は oDiv1.style.opacity=alpha/100 です。
スクロールバーイベントを実装します:
コード:
<!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>
質問 1:
あなたが達成したい機能: 3 つの並列 div を自由に並列スケーリングします。
コード:
<!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>
複数オブジェクトの移動に対してタイマーのみを設定した場合 (グローバル タイマーを設定した場合)、3 つの div がグローバル タイマーを共有し、1 つの div が縮小アクションを完了しないと、他の div がタイマーを開始してストレッチを実行します。アクションは、タイマーがグローバルであるため、前の div のタイマーが上書きされるかキャンセルされるため、前のタイマーでは昨夜のアクションを完全に減らすことができません。解決策は、各 div に属性タイマーを設定することです。
質問 2:
実現したい機能: 複数の写真のフェードインとフェードアウト。
コード:
<!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>
コード:
<!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. offsetwidth が取得するのは、オブジェクトの純粋な幅だけではなく、オブジェクトの幅とマージンも取得します。次に、文 obj.style.width=obj.offsetwidth-1 "px"; では、本来の目的は 1px の均一な速度で画像を縮小することですが、境界線の幅が 0px ではなく 1px に設定されている場合、次に、offsetwidth の値です。実際には、これは obj の幅です (注: style.width ではありません。つまり、行間の幅ではありません)。 2. 上の文は obj.style.width=obj の幅 2 になります。 -1 "px"; 代わりに画像が増加します。解決策は、offsetwidth を使用するのではなく、obj の幅を使用することです。幅は getStyle メソッドを通じて取得されます。
2.getStyleメソッドで文字列を取得します。 parseint を使用して数値型にキャストする必要があります。
<!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>