跟大家講解下有關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中文網