JavaScript的DOM元素尺寸和位置

本章,我們主要討論一下頁面中的某一個元素它的各種大小和各種位置的計算方式,以
便更好的理解。


一.獲取元素 CSS大小
1.通過style 內聯獲取元素的大小

  1. var box = document.getElementById('box'); //獲取元素 
  2. box.style.width; //200px、空 
  3. box.style.height; //200px、空 

PS:style 獲取只能獲取到行內style 屬性的CSS 樣式中的寬和高,如果有獲取;如果沒
有則返回空。

2.通過計算獲取元素的大小

  1. var style = window.getComputedStyle ? 
  2. window.getComputedStyle(box, null) : null || box.currentStyle; 
  3. style.width; //1424px、200px、auto 
  4. style.height; //18px、200px、auto 

PS:通過計算獲取元素的大小,無關你是否是行內、內聯或者鏈接,它經過計算後得
到的結果返回出來。如果本身設置大小,它會返回元素的大小,如果本身沒有設置,非IE
瀏覽器會返回默認的大小,IE 瀏覽器返回auto。


3.通過CSSStyleSheet 對象中的c***ules(或rules)屬性獲取元素大小

  1. var sheet = document.styleSheets[0]; //獲取link 或style 
  2. var rule = (sheet.c***ules || sheet.rules)[0]; //獲取第一條規則 
  3. rule.style.width; //200px、空 
  4. rule.style.height; //200px、空 

PS:c***ules(或rules)只能獲取到內聯和鏈接樣式的寬和高,不能獲取到行內和計算後
的樣式。
總結:以上的三種CSS 獲取元素大小的方法,只能獲取元素的CSS 大小,卻無法獲取元
素本身實際的大小。比如加上了內邊距、滾動條、邊框之類的。


二.獲取元素實際大小
1.clientWidth 和clientHeight
這組屬性可以獲取元素可視區的大小,可以得到元素內容及內邊距所佔據的空間大小。

  1. box.clientWidth; //200 
  2. box.clientHeight; //200 

PS:返回了元素大小,但沒有單位,默認單位是px,如果你強行設置了單位,比如100em
之類,它還是會返回px 的大小。(CSS 獲取的話,是照着你設置的樣式獲取)。
PS:對於元素的實際大小,clientWidth 和clientHeight 理解方式如下:
1.增加邊框,無變化,爲200;
2.增加外邊距,無變化,爲200;
3.增加滾動條,最終值等於原本大小減去滾動條的大小,爲184;
4.增加內邊距,最終值等於原本大小加上內邊距的大小,爲220;
PS:如果說沒有設置任何CSS 的寬和高度,那麼非IE 瀏覽器會算上滾動條和內邊距的
計算後的大小,而IE 瀏覽器則返回0。


2.scrollWidth 和scrollHeight
這組屬性可以獲取滾動內容的元素大小。

  1. box.scrollWidth; //200 
  2. box.scrollWidth; //200 

PS:返回了元素大小,默認單位是px。如果沒有設置任何CSS 的寬和高度,它會得到
計算後的寬度和高度。
PS:對於元素的實際大小,scrollWidth 和scrollHeight 理解如下:
1.增加邊框,不同瀏覽器有不同解釋:
a) Firefox 和Opera 瀏覽器會增加邊框的大小,220 x 220
b) IE、Chrome 和Safari 瀏覽器會忽略邊框大小,200 x 200
c) IE 瀏覽器只顯示它本來內容的高度,200 x 18
2.增加內邊距,最終值會等於原本大小加上內邊距大小,220 x 220,IE 爲220 x 38
3.增加滾動條,最終值會等於原本大小減去滾動條大小,184 x 184,IE 爲184 x 18
4.增加外邊據,無變化。
5.增加內容溢出,Firefox、Chrome 和IE 獲取實際內容高度,Opera 比前三個瀏覽
器獲取的高度偏小,Safari 比前三個瀏覽器獲取的高度偏大。


3.offsetWidth 和offsetHeight
這組屬性可以返回元素實際大小,包含邊框、內邊距和滾動條。

  1. box.offsetWidth; //200 
  2. box.offsetHeight; //200 

PS:返回了元素大小,默認單位是px。如果沒有設置任何CSS 的寬和高度,他會得到
計算後的寬度和高度。
PS:對於元素的實際大小,offsetWidth 和offsetHeight 理解如下:
1.增加邊框,最終值會等於原本大小加上邊框大小,爲220;
2.增加內邊距,最終值會等於原本大小加上內邊距大小,爲220;
3.增加外邊據,無變化;
4.增加滾動條,無變化,不會減小;
PS:對於元素大小的獲取,一般是塊級(block)元素並且以設置了CSS 大小的元素較爲
方便。如果是內聯元素(inline)或者沒有設置大小的元素就尤爲麻煩,所以,建議使用的時候
注意。


三.獲取元素周邊大小
1.clientLeft 和clientTop
這組屬性可以獲取元素設置了左邊框和上邊框的大小。

  1. box.clientLeft; //獲取左邊框的長度 
  2. box.clientTop; //獲取上邊框的長度 

PS:目前只提供了Left 和Top 這組,並沒有提供Right 和Bottom。如果四條邊寬度不
同的話,可以直接通過計算後的樣式獲取,或者採用以上三組獲取元素大小的減法求得。


2.offsetLeft 和offsetTop
這組屬性可以獲取當前元素相對於父元素的位置。

  1. box.offsetLeft; //50 
  2. box.offsetTop; //50 

PS:獲取元素當前相對於父元素的位置,最好將它設置爲定位position:absolute;否則
不同的瀏覽器會有不同的解釋。
PS:加上邊框和內邊距不會影響它的位置,但加上外邊據會累加。

  1. box.offsetParent; //得到父元素 

PS:offsetParent 中,如果本身父元素是<body>,非IE 返回body 對象,IE 返回html 對
象。如果兩個元素嵌套,如果上父元素沒有使用定位position:absolute,那麼offsetParent 將
返回body 對象或html 對象。所以,在獲取offsetLeft 和offsetTop 時候,CSS 定位很重要。


如果說,在很多層次裏,外層已經定位,我們怎麼獲取裏層的元素距離body 或html
元素之間的距離呢?也就是獲取任意一個元素距離頁面上的位置。那麼我們可以編寫函數,
通過不停的向上回溯獲取累加來實現。

  1. box.offsetTop + box.offsetParent.offsetTop; //只有兩層的情況下 

如果多層的話,就必須使用循環或遞歸。

  1. function offsetLeft(element) { 
  2. var left = element.offsetLeft; //得到第一層距離 
  3. var parent = element.offsetParent; //得到第一個父元素 
  4. while (parent !== null) { //如果還有上一層父元素 
  5. left += parent.offsetLeft; //把本層的距離累加 
  6. parent = parent.offsetParent; //得到本層的父元素 
  7. //然後繼續循環 
  8. return left; 

3.scrollTop 和scrollLeft
這組屬性可以獲取滾動條被隱藏的區域大小,也可設置定位到該區域。

  1. box.scrollTop; //獲取滾動內容上方的位置 
  2. box.scrollLeft; //獲取滾動內容左方的位置 

如果要讓滾動條滾動到最初始的位置,那麼可以寫一個函數:

  1. function scrollStart(element) { 
  2. if (element.scrollTop != 0) element.scrollTop = 0; 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章