먼저 이 버그가 어떻게 발생하는지 살펴보겠습니다. 코드 복사 코드는 다음과 같습니다. <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> ~ > </본문><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> <script type="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> 테두리: 1px 실선 #CCCCFF;<div class="codebody" id="code8073"> }<br> > <br> <p>이때 코드를 실행해보면 div가 오른쪽으로 천천히 증가하는 것을 볼 수 있습니다. . . image BUG가 갑자기 나타났습니다. . . . 분명히 마이너스 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> <p>이 문장을 다시 실행하면 div의 너비는 201px입니다. 이 경우 매번 1px씩 늘어나지만 점차 커집니다. 오프셋 버그입니다. </p> <p>이 문제를 어떻게 해결하나요? </p> <p>사실 이 offsetWidth는 필요하지 않습니다. 우리는 너비를 사용합니다! ! CSS 스타일로 너비를 직접 구하는 함수를 작성하세요 </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"> <br> function getStyle(obj, 이름) {<br> If (obj.currentStyle) {<br> return obj.currentStyle[이름];<br> } else {<br> return getCompulatedStyle(obj, null)[name];<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"> <br> <script type="text/javascript"><br> setInterval(function(){<br> var oDiv=document.getElementById("div1");<br> oDiv.style.width=parseInt(getStyle(oDiv,'width'))-1 'px';<br> },30);<br> 함수 getStyle(obj, 이름) {<br> If (obj.currentStyle) {<br> return obj.currentStyle[이름];<br> } else {<br> return getCompulatedStyle(obj, null)[name];<br> }<br> }<br> > <br> </div> <br> 이렇게 하면 프로그램이 문제 없이 실행됩니다. <br> </div>