JavaScript中offsetWidth的bug及解決方法
offsetWidth表示對(duì)象的可見(jiàn)寬度。
比如:
#div1 { width: 100px; height: 200px; background: red; }
結(jié)果:100
#div1 { width: 100px; height: 200px; background: red; border: 2px solid black; }
結(jié)果:104 (100 + 2 + 2)
#div1 { width: 100px; height: 200px; background: red; border: 2px solid black; padding: 20px; }
結(jié)果:144 (100 + 2 + 2 + 20 + 20)
#div1 { width: 100px; height: 200px; background: red; margin: 4px; }
結(jié)果:100
**
所以,offsetWidth = width + padding + border, 和margin無(wú)關(guān)。
**
下面來(lái)看一個(gè)例子:
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>offsetWidth</title> <style type="text/css"> #div1 { width: 500px; height: 200px; background: red; } </style> </head> <body> <div id="div1"></div> <script type="text/javascript"> var oDiv = document.getElementById('div1'); setInterval(function() { oDiv.style.width = oDiv.offsetWidth - 1 + 'px'; }, 50); </script> </body> </html>
現(xiàn)象:紅色div逐漸變窄,直到消失,沒(méi)問(wèn)題!
如果給div加一個(gè)border,呢?
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>offsetWidth</title> <style type="text/css"> #div1 { width: 500px; height: 200px; background: red; border: 1px solid black; } </style> </head> <body> <div id="div1"></div> <script type="text/javascript"> var oDiv = document.getElementById('div1'); setInterval(function() { oDiv.style.width = oDiv.offsetWidth - 1 + 'px'; }, 50); </script> </body> </html>
現(xiàn)象:紅色div不僅沒(méi)有變窄,反而越來(lái)越寬……
*
原因也很簡(jiǎn)單:就是border的直接原因,因?yàn)閛ffsetWidth是把border算進(jìn)去的,定時(shí)器輪詢(xún)的時(shí)候,第一次,width : 102 - 1 == 101 ,那么offsetWidth立馬就變?yōu)?03;第二次,width: 103 - 1 == 102, 那么offsetWidth立馬就變?yōu)?04;緊接著第三次,width: 104 - 1 == 103, offsetWidth就為104了……
倘若把 oDiv.style.width = oDiv.offsetWidth - 1 + ‘px'; 換成 -2,那么紅色div就不動(dòng)了,不會(huì)變寬也不會(huì)變窄,因?yàn)閛ffsetWidth為102,減去2就是100和原本的width相等,下一次循環(huán),offsetWidth就等于100加上border的2,再減去2還是100,所以不動(dòng)……*
解決方案也很簡(jiǎn)單,惹不起還躲不起?不用offsetWidth了!
我們都知道,獲取元素的行間樣式直接用element.style.width即可,但是這只針對(duì)元素的行間樣式,如果寫(xiě)在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"> #div1 { width: 500px; height: 200px; background: red; border: 1px solid black; } </style> </head> <body> <div id="div1"></div> <script type="text/javascript"> var oDiv = document.getElementById('div1'); function getStyle(obj, attr) { if (obj.currentStyle) {//IE return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } alert(getStyle(oDiv, 'width'));//直接彈出 “500px” </script> </body> </html>
有了上面的這個(gè)封裝,我們就可以解決offsetWidth帶來(lái)的困擾了
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>offsetWidth</title> <style type="text/css"> #div1 { width: 500px; height: 200px; background: red; border: 1px solid black; } </style> </head> <body> <div id="div1"></div> <script type="text/javascript"> var oDiv = document.getElementById('div1'); function getStyle(obj, attr) { if (obj.currentStyle) {//IE return obj.currentStyle[attr]; } else { return getComputedStyle(obj, false)[attr]; } } setInterval(function() { //parseInt是因?yàn)間etStyle()返回的是‘px'帶單位,要整數(shù)化 oDiv.style.width = parseInt(getStyle(oDiv, 'width')) - 1 + 'px'; }, 30); </script> </body> </html>
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- js中offset,client , scroll 三大元素知識(shí)點(diǎn)總結(jié)
- MySQL查詢(xún)中LIMIT的大offset導(dǎo)致性能低下淺析
- JS中offset和勻速動(dòng)畫(huà)詳解
- js獲取元素的偏移量offset簡(jiǎn)單方法(必看)
- 詳解原生js實(shí)現(xiàn)offset方法
- div的offsetLeft與style.left區(qū)別
- JavaScript中style.left與offsetLeft的使用及區(qū)別詳解
- window.setInterval()方法的定義和用法及offsetLeft與style.left的區(qū)別
- springboot中如何實(shí)現(xiàn)kafa指定offset消費(fèi)
相關(guān)文章
Javascript 實(shí)現(xiàn)TreeView CheckBox全選效果
Javascript 實(shí)現(xiàn)TreeView CheckBox 選中父節(jié)點(diǎn)時(shí)所有子節(jié)點(diǎn)全選,取消時(shí)全部取消2010-01-01微信小程序new Date()方法失效問(wèn)題解決方法
這篇文章主要介紹了小程序new Date()方法失效問(wèn)題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07javascript appendChild,innerHTML,join性能比較代碼
在實(shí)際應(yīng)用中,應(yīng)該避免直接用innerHTML,對(duì)于大量的字符連接運(yùn)算,應(yīng)該考慮先運(yùn)算再輸出。2009-08-08JS中的常見(jiàn)數(shù)組遍歷案例詳解(forEach,?map,?filter,?sort,?reduce,?ever
這篇文章主要介紹了JS中的常見(jiàn)數(shù)組遍歷方法詳解(forEach,?map,?filter,?sort,?reduce,?every),本篇講用實(shí)際案例詳解他們的語(yǔ)法和用法,需要的朋友可以參考下2023-05-05JavaScript實(shí)現(xiàn)復(fù)制或剪切內(nèi)容到剪貼板功能的方法
這篇文章主要介紹了JavaScript實(shí)現(xiàn)復(fù)制或剪切內(nèi)容到剪貼板功能的方法,我們平時(shí)看到的網(wǎng)頁(yè)上很多一鍵復(fù)制功能就是如此實(shí)現(xiàn),需要的朋友可以參考下2016-05-05兼容最新firefox、chrome和IE的javascript圖片預(yù)覽實(shí)現(xiàn)代碼
這篇文章主要介紹了兼容最新firefox、chrome和IE的javascript圖片預(yù)覽實(shí)現(xiàn)代碼,測(cè)試了瀏覽器firefox6、firefox12、chrome 25.0.1364.172 m、IE6-IE10 都兼容,需要的朋友可以參考下2014-08-08