JavaScript中offsetWidth的缺陷及解决方法

  

offsetWidth表示对象的可见宽度。
  比如:

        # div1 {   宽度:100 px;   身高:200 px;   背景:红色;   }   之前      

结果:100

        # div1 {   宽度:100 px;   身高:200 px;   背景:红色;   边界:2 px固体黑色;   }   之前      

结果:104 (100 + 2 + 2)

        # div1 {   宽度:100 px;   身高:200 px;   背景:红色;   边界:2 px固体黑色;   填充:20 px;   }   之前      

结果:144 (100 + 2 + 2 + 20 + 20)

        # div1 {   宽度:100 px;   身高:200 px;   背景:红色;   保证金:4 px;   }   之前      

结果:100

  

* *   

所以,<强> offsetWidth=宽度+填充+边界,和保证金无关。

  

* *
  下面来看一个例子:

        & lt; !DOCTYPE html>   & lt; html>   & lt; head>   & lt;元charset=皍tf - 8”比;   & lt; title> offsetWidth   & lt;风格类型=" text/css "比;   # div1 {   宽度:500 px;   身高:200 px;   背景:红色;   }   & lt;/style>   & lt;/head>   & lt; body>   & lt; div id=" div1 "祝辞& lt;/div>   & lt;脚本type=" text/javascript祝辞   var oDiv=. getelementbyid (“div1”);   setInterval(函数(){   oDiv.style。宽度=oDiv。offsetWidth - 1 +“px”;   },50);   & lt;/script>   & lt;/body>   & lt;/html>   之前      

<强>现象:红色div逐渐变窄,直到消失,没问题!

  

如果给div加一个边境呢?

        & lt; !DOCTYPE html>   & lt; html>   & lt; head>   & lt;元charset=皍tf - 8”比;   & lt; title> offsetWidth   & lt;风格类型=" text/css "比;   # div1 {   宽度:500 px;   身高:200 px;   背景:红色;   边界:1 px固体黑色;   }   & lt;/style>   & lt;/head>   & lt; body>   & lt; div id=" div1 "祝辞& lt;/div>   & lt;脚本type=" text/javascript祝辞   var oDiv=. getelementbyid (“div1”);   setInterval(函数(){   oDiv.style。宽度=oDiv。offsetWidth - 1 +“px”;   },50);   & lt;/script>   & lt;/body>   & lt;/html>         之前      

现象:红色div不仅没有变窄,反而越来越宽……
  

  

 JavaScript中offsetWidth的缺陷及解决方法”> * </p>
  <p>原因也很简单:就是边境的直接原因,因为offsetWidth是把边境算进去的,定时器轮询的时候,第一次,宽度:102 - 1==101,那么offsetWidth立马就变为103;第二次,宽度:103 - 1==102,那么offsetWidth立马就变为104;紧接着第三次,宽度:104 - 103==,offsetWidth就为104了……<br/>
  </p>
  <p>倘若把oDiv.style。宽度=oDiv。offsetWidth - 1 +“px”;换成2,那么红色div就不动了,不会变宽也不会变窄,因为offsetWidth为102,减2就去是100和原本的宽度相等,下一次循环,offsetWidth就等于100加边界上的2,再减2还去是100年,所以不动……* </p>
  <p>解决方案也很简单,惹不起还躲不起?不用offsetWidth了! <br/>
  </p>
  <p>我们都知道,获取元素的行间样式直接用element.style.width即可,但是这只针对元素的行间样式,如果写在css中,你就获取不到了。<br/>
  </p>
  <p>但也是有办法的:</p>
  <ul>
  <李> IE中用element.currentStyle。宽/element.currentStyle。(“宽度”);李</>
  <李>非IE中用getComputedStyle(元素,假)(“宽度”)<br/>
  李</>
  </ul>
  
  <pre类=   & lt; !DOCTYPE html>   & lt; html>   & lt; head>   & lt;元charset=皍tf - 8”比;   & lt; title> offsetWidth   & lt;风格类型=" text/css "比;   # div1 {   宽度:500 px;   身高:200 px;   背景:红色;   边界:1 px固体黑色;   }   & lt;/style>   & lt;/head>   & lt; body>   & lt; div id=" div1 "祝辞& lt;/div>   & lt;脚本type=" text/javascript祝辞      var oDiv=. getelementbyid (“div1”);   函数getStyle (obj, attr) {   如果(obj.currentStyle) {//IE   返回obj.currentStyle [attr);   其他}{   返回getComputedStyle (obj, false) [attr);   }   }   alert (getStyle (oDiv“宽度”));//直接弹出“500 px”   & lt;/script>   & lt;/body>   & lt;/html>      

JavaScript中offsetWidth的缺陷及解决方法