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>
聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com