科技知識動態:JavaScript中關于offsetWidth的bug問題以及解決方法

導讀跟大家講解下有關JavaScript中關于offsetWidth的bug問題以及解決方法,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說JavaSc

跟大家講解下有關JavaScript中關于offsetWidth的bug問題以及解決方法,相信小伙伴們對這個話題應該也很關注吧,現在就為小伙伴們說說JavaScript中關于offsetWidth的bug問題以及解決方法,小編也收集到了有關JavaScript中關于offsetWidth的bug問題以及解決方法的相關資料,希望大家看到了會喜歡。

這篇文章主要為大家詳細介紹了JavaScript中offsetWidth的bug及解決方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下

offsetWidth表示對象的可見寬度。 比如:

#p1 { width: 100px; height: 200px; background: red;}

結果:100

#p1 { width: 100px; height: 200px; background: red; border: 2px solid black;}

結果:104 (100 + 2 + 2)

#p1 { width: 100px; height: 200px; background: red; border: 2px solid black; padding: 20px;}

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

#p1 { width: 100px; height: 200px; background: red; margin: 4px;}

結果:100

**

所以,offsetWidth = width + padding + border, 和margin無關。

** 下面來看一個例子:

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>offsetWidth</title> <style type="text/css"> #p1 { width: 500px; height: 200px; background: red; } </style></head><body> <p id="p1"></p> <script type="text/javascript"> var op = document.getElementById('p1'); setInterval(function() { op.style.width = op.offsetWidth - 1 + 'px'; }, 50); </script></body></html>

現象:紅色p逐漸變窄,直到消失,沒問題!

如果給p加一個border,呢?

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>offsetWidth</title> <style type="text/css"> #p1 { width: 500px; height: 200px; background: red; border: 1px solid black; } </style></head><body> <p id="p1"></p> <script type="text/javascript"> var op = document.getElementById('p1'); setInterval(function() { op.style.width = op.offsetWidth - 1 + 'px'; }, 50); </script></body></html>

現象:紅色p不僅沒有變窄,反而越來越寬……

*

原因也很簡單:就是border的直接原因,因為offsetWidth是把border算進去的,定時器輪詢的時候,第一次,width : 102 - 1 == 101 ,那么offsetWidth立馬就變為103;第二次,width: 103 - 1 == 102, 那么offsetWidth立馬就變為104;緊接著第三次,width: 104 - 1 == 103, offsetWidth就為104了……

倘若把 op.style.width = op.offsetWidth - 1 + ‘px'; 換成 -2,那么紅色p就不動了,不會變寬也不會變窄,因為offsetWidth為102,減去2就是100和原本的width相等,下一次循環,offsetWidth就等于100加上border的2,再減去2還是100,所以不動……*

解決方案也很簡單,惹不起還躲不起?不用offsetWidth了!

我們都知道,獲取元素的行間樣式直接用element.style.width即可,但是這只針對元素的行間樣式,如果寫在css中,你就獲取不到了.

但也是有辦法的:

IE中用element.currentStyle.width / element.currentStyle.[‘width'];

非IE中用getComputedStyle(element, false)[‘width']

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>offsetWidth</title> <style type="text/css"> #p1 { width: 500px; height: 200px; background: red; border: 1px solid black; } </style></head><body> <p id="p1"></p> <script type="text/javascript"> var op = document.getElementById('p1'); function getStyle(obj, attr) { if (obj.currentStyle) {//IE return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } alert(getStyle(op, 'width'));//直接彈出 “500px” </script></body></html>

有了上面的這個封裝,我們就可以解決offsetWidth帶來的困擾了

<!DOCTYPE html><html><head> <meta charset="utf-8"> <title>offsetWidth</title> <style type="text/css"> #p1 { width: 500px; height: 200px; background: red; border: 1px solid black; } </style></head><body> <p id="p1"></p> <script type="text/javascript"> var op = document.getElementById('p1'); function getStyle(obj, attr) { if (obj.currentStyle) {//IE return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } setInterval(function() { //parseInt是因為getStyle()返回的是‘px'帶單位,要整數化 op.style.width = parseInt(getStyle(op, 'width')) - 1 + 'px'; }, 30); </script></body></html>

以上就是JavaScript中關于offsetWidth的bug問題以及解決方法的詳細內容,更多請關注php中文網其它相關文章!

來源:php中文網

免責聲明:本文由用戶上傳,如有侵權請聯系刪除!