まず、このバグがどのように発生するかを見てみましょう。 コードをコピーします コードは次のとおりです: <br> #div1 {<br> 幅: 200px;<br> 高さ:200px; <br> 背景: 赤;<br> }<br> <br><br> </div> <p></p> <div class="codetitle"><span>コードをコピーします<a style="CURSOR: pointer" data="90578" class="copybut" id="copybut90578" onclick="doCopy('code90578')"><u></u> コードは次のとおりです:</a></span></div> <div class="codebody" id="code90578"> <div id="div1"><br> </body><br> <br><br> <br>以下はテストに使用した Javascript コードです。目的は div を徐々に狭くすることです。 <br> </div> <p></p> <p>コードをコピーします</p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="68552" class="copybut" id="copybut68552" onclick="doCopy('code68552')"> コードは次のとおりです:<u></u></a> <スクリプトタイプ="text/javascript"></span> setInterval(function(){</div> var oDiv=document.getElementById("div1");<div class="codebody" id="code68552"> oDiv.style.width=oDiv.offsetWidth-1 'px';<br> },30);<br> <br><br> <br>JavaScript コードは非常に単純です。実行すると、目的の div が徐々に小さくなります。 <br> <br>では、このオフセットのバグはどこから来たのでしょうか? <br> <br>それではスタイルを動かしてみましょう。魔法のようなことが起こります。 。 。 </div> div1 にスタイル境界線を追加します: 1px 実線 #CCCCFF;<p> </p> <p></p> <p></p>コードをコピーします<p></p> <p> コードは次のとおりです:</p> <div class="codetitle"> <span><a style="CURSOR: pointer" data="8073" class="copybut" id="copybut8073" onclick="doCopy('code8073')"> <style type="text/css"><u> #div1 {</u> 幅: 200px;</a> 高さ:200px; </span> 背景: 赤;</div> 境界線: 1 ピクセルの実線 #CCCCFF;<div class="codebody" id="code8073"> }<br> <br> <p>この時点でコードを実行すると、div が右に向かってゆっくりと増加していることがわかります。 。 。突然現れた画像バグ。 。 。 。 明らかにマイナス1ですが、なぜこのようなことが起こるのでしょうか? </p> <p>オフセットの特性について考えてみましょう: </p> <p>例: div 幅: 200px 境界線 1px。 実際、彼が取得した offsetWidth は 202px です。 </p> <p>それでは、動きを開始したばかりのとき、div の幅は実際には 200px だったので、offsetWidth は 202 でした。</p> <p>この時点では、oDiv.style.width=oDiv.offsetWidth-1 'px'; この文は oDiv.style.width=202-1=201px に等しく、それを width に割り当てます。 </p>この文を再度実行すると、div の幅は 201px ですが、毎回 1px ずつ増加しますが、徐々に大きくなります。 これがオフセットのバグです。 <p> </p>この問題を解決するにはどうすればよいですか? <p> </p>実際には、この offsetWidth は必要ありません。 幅を使用します! ! CSSスタイルで幅を直接取得する関数を記述します<p> </p>行間にないスタイルを取得します: <p> </p> <p></p> <div class="codetitle"><span><a style="CURSOR: pointer" data="89510" class="copybut" id="copybut89510" onclick="doCopy('code89510')">コードをコピーします<u></u></a> コードは次のとおりです:</span></div> <div class="codebody" id="code89510"> function getStyle(obj, name) {<br> If (obj.currentStyle) {<br> return obj.currentStyle[name];<br> } else {<br> return getComputedStyle(obj, null)[name];<br> }<br> }<br> <br> </div> 次に、元のコードを変更しましょう: <p> </p> <p></p> <div class="codetitle"><span><a style="CURSOR: pointer" data="71756" class="copybut" id="copybut71756" onclick="doCopy('code71756')">コードをコピーします<u></u></a> コードは次のとおりです:</span></div> <div class="codebody" id="code71756"> <スクリプトタイプ="text/javascript"><br> setInterval(function(){<br> var oDiv=document.getElementById("div1");<br> oDiv.style.width=parseInt(getStyle(oDiv,'width'))-1 'px';<br> },30);<br> function getStyle(obj, name) {<br> If (obj.currentStyle) {<br> return obj.currentStyle[name];<br> } else {<br> return getComputedStyle(obj, null)[name];<br> }<br> }<br> <br><br> </div> このようにして、プログラムは問題なく実行されます。 <br> </div>