關(guān)于元素的尺寸(dimensions) 說明
元素占據(jù)的物理空間的尺寸
如果你需要獲得元素占據(jù)的物理空間,那么使用offsetHeight和offsetWidth。
自然而然此物理空間必然包含的有:padding、滾動(dòng)條、border。這兩個(gè)屬性與getBoundingClientRect()的height和width屬性是一致的。
為了幫助理解請(qǐng)看下圖:

元素內(nèi)容的可視區(qū)域的尺寸
可視區(qū)域包含padding,但是不包含border、滾動(dòng)條。此時(shí)請(qǐng)使用clientHeight和clientWidth。
為了幫助理解請(qǐng)看下圖:

元素全部內(nèi)容的尺寸
如果你要獲取元素內(nèi)容的真正大小,當(dāng)然也包含那些不可見的內(nèi)容,此時(shí)你需要使用scrollHeight/scrollWidth。
例如一張600*400的圖片被包含在一個(gè)300*300的可滾動(dòng)的容器元素內(nèi),那么scrollWidth將返回600,而scrollHeight將返回400
實(shí)測:
當(dāng)元素存在滾動(dòng)條時(shí),chrome瀏覽器獲取元素的scrollHeight有時(shí)候不準(zhǔn)確!但是本文的例子是正確的,不知道怎么重現(xiàn)。
獲取元素的真實(shí)尺寸
大部分場景,我們并不關(guān)心元素的全部內(nèi)容的尺寸(window/document/body元素除外),最常用的恐怕還是獲取元素占據(jù)的物理空間(offsetHeight/offsetWidth)。
比如對(duì)某段文字設(shè)置自定義的tooltip,這個(gè)時(shí)候需要獲取目標(biāo)元素的高度然后對(duì)tooltip進(jìn)行定位。
不論是clientHeight還是offsetHeight它們都包含了padding,假設(shè)這段文字包含了100px的padding,這個(gè)tooltip的位置顯然會(huì)極其的不準(zhǔn)確。
因此獲取元素的高度通常是需要去掉padding。
由于元素的style屬性只能獲取到內(nèi)聯(lián)樣式的width/height,所以在IE中需要使用el.currentStyle.height/width,
而標(biāo)準(zhǔn)瀏覽器中使用window.getComputedStyle(el,null).width/height。
下面是我整理的園友Snandy的一個(gè)用戶獲取元素真實(shí)高度和寬度的方法 :
function getStyle(el) {
if(window.getComputedStyle) {
return window.getComputedStyle(el, null);
}else{
return el.currentStyle;
}
}
function getWH(el, name) {
var val = name === "width" ? el.offsetWidth : el.offsetHeight,
which = name === "width" ? ['Left', 'Right'] : ['Top', 'Bottom'];
// display is none
if(val === 0) {
return 0;
}
var style = getStyle(el);
for(var i = 0, a; a = which[i++];) {
val -= parseFloat( style["border" + a + "Width"]) || 0;
val -= parseFloat( style["padding" + a ] ) || 0;
}
return val;
}
使用腳本庫往往能幫助我們解決一些棘手的問題,下面來看看jQuery的相關(guān)方法
jQuery.height()/jQuery.width()
返回一個(gè)整數(shù),為匹配的jQuery對(duì)象集合中第一個(gè)元素的高度值。
注意此結(jié)果不關(guān)心盒式模型,不包含元素的padding。此方法等價(jià)于getWH(el,'height/width')
這個(gè)方法同樣能計(jì)算出window和document的高度。
jQuery.innerHeight()/jQuery.innerWidth()
對(duì)比jQuery.height() /jQuery.width() 此結(jié)果包含padding,但是不包含border。
當(dāng)元素el未設(shè)置border時(shí),此方法等價(jià)于el.offsetHeight/offsetWidth
jQuery.outerHeight()/jQuery.outerWidth()
對(duì)比jQuery.height() /jQuery.width() 此結(jié)果包含padding和border,默認(rèn)不包含margin。
當(dāng)元素未指定margin時(shí),此方法等價(jià)于el.offsetHeight/offsetWidth
可以傳入一個(gè)bool變量來指定是否包含margin。
注意:
由于獲取普通元素的全部內(nèi)容的尺寸意義不大(某些元素除外如window、document、iframe等),
所以jQuery的這三個(gè)方法都未包含不可見區(qū)域。
小測試
下面是一個(gè)div設(shè)置了高度200px,padding為3px,border為1px,里面的圖片為958*512
上面的值你都猜對(duì)了嗎?
更新
又檢查了下測試代碼,scrollHeight在chrome下不準(zhǔn)確的原因是使用了jQuery.ready(),而剛好測試的元素內(nèi)部包含一張圖片。
用過jQuery.ready()的都知道,此時(shí)DOM樹已經(jīng)加載完成,但是圖片元素還沒有完全加載, 因而chrome的處理方式是對(duì)的。
于是我就上例又測試了一遍:
在IE 6 / 8返回結(jié)果為522/519
chrome返回結(jié)果為189
Firefox有一點(diǎn)特殊,不斷刷新頁面會(huì)有兩種結(jié)果出現(xiàn):1)522;2)189,但是大部分情況是522
出現(xiàn)這種情況肯定與jQuery 1.6.2的ready函數(shù)的實(shí)現(xiàn)有關(guān)系。
不過就上述結(jié)果來看,是否可以推斷jQuery.ready()在chrome中是最安全最快的。
[Ctrl+A 全選 注:引入外部Js需再刷新一下頁面才能執(zhí)行]
參考資料
各情景下元素寬高的獲取 by Snandy
Determining the dimensions of elements
Measuring Element Dimension and Location with CSSOM in Internet Explorer 9
相關(guān)文章
JS實(shí)現(xiàn)多物體運(yùn)動(dòng)的方法詳解
這篇文章主要介紹了JS實(shí)現(xiàn)多物體運(yùn)動(dòng)的方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了javascript實(shí)現(xiàn)多物體運(yùn)動(dòng)的原理與相關(guān)操作技巧,需要的朋友可以參考下2018-01-01javascript appendChild,innerHTML,join性能比較代碼
在實(shí)際應(yīng)用中,應(yīng)該避免直接用innerHTML,對(duì)于大量的字符連接運(yùn)算,應(yīng)該考慮先運(yùn)算再輸出。2009-08-08點(diǎn)擊單元格后可編輯單元格內(nèi)文本如何制作
點(diǎn)擊單元格后可編輯單元格內(nèi)文本如何制作...2006-10-10bootstrap實(shí)現(xiàn)每隔5秒自動(dòng)輪播效果
這篇文章主要介紹了bootstrap實(shí)現(xiàn)每隔5秒自動(dòng)輪播效果,可以自己設(shè)置輪播間隔時(shí)間,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12JavaScript實(shí)現(xiàn)新年倒計(jì)時(shí)效果
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)新年倒計(jì)時(shí)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11IE和Firefox在JavaScript應(yīng)用中的兼容性探討
今天在使用CSS屬性的時(shí)候發(fā)現(xiàn)"cursor:hand;"在Firefox中鼠標(biāo)不會(huì)變?yōu)槭中?,后來上網(wǎng)搜索了一下資料,發(fā)現(xiàn)hand這個(gè)cursor屬性在Firrefox中不兼容,使用"cursor:pointer"就都可以顯示了。2008-04-04純Javascript實(shí)現(xiàn)ping功能的方法
這篇文章主要介紹了純Javascript實(shí)現(xiàn)ping功能的方法,實(shí)例分析了javascript實(shí)現(xiàn)ping功能的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03js實(shí)現(xiàn)的八點(diǎn)拖動(dòng)修改div大小的代碼
八點(diǎn)改變div大小的實(shí)現(xiàn)代碼,代碼相對(duì)來說并不多,需要的朋友可以參考下。2010-02-02