一 獲取元素的CSS大小
1.通過style內聯獲取元素的大小
// PS:style獲取只能取到行內style屬性的CSS樣式中的寬和高,如果有,則獲取;如果沒有則返回空;
2.通過計算獲取元素的大小
3.通過CSSStyleSheet對象中的cssRules(或rules)屬性獲取元素的大小;
總結:以上三種CSS獲取元素大小的方法,只能獲取元素的CSS大小,卻無法獲取元素本身實際的大小;比如加上內邊距/滾動條/邊框之類的;
二 獲取元素實際大小
1.clientWidth和clientHeight
 這組屬性可以獲取元素可視區的大小,包含元素內容及內邊距所占據的空間大小;
    box.clientWidth;                                // 200;
     PS:返回了元素大小,但沒有單位,默認單位是px;
     PS:對于元素的實際大小,clientWidth和clientHeight理解如下:
     1.元素增加邊框,無變化,200;
     2.元素增加外邊框,無變化,200;
     3.增加滾動條,最終值=原本大小-滾動條大小;184;
     4.增加內邊距,最終值=原本大小+內邊距大小;220;
 PS:如果沒有設置任何CSS的width和height,那么非IE會算上滾動條和內邊距的計算后的大小;而IE則返回0;
2.scrollWidth和scrollHeight
 這組屬性可以獲取沒有滾動條的情況下,元素內容的總高度;
    box.scrollWidth;
    // PS:返回了元素大小,默認單位是px;如果沒有設置任何CSS的width和height,它會得到計算后的寬度和高度;
3.offsetWidth和offsetHeight
 這組屬性可以返回元素實際大小,包含邊框/內邊距和滾動條;
    box.offsetWidth;                                 200
     PS:返回了元素大小,默認單位是px;如果沒有設置任何CSS的width和height,它會得到計算后的寬度和高度;
     PS:對于元素的實際大小,理解如下:
     1.增加邊框,最終值=原本大小+邊框大小;220;
     2.增加內邊距,最終值=原本大小+內邊距大小;220;
     3.增加外邊據,無變化;
     4.增加滾動條,無變化,不會減小;
PS:對于元素大小的獲取,一般是塊級(block)元素并且已設置了CSS大小的元素較為方便;
三 獲取元素周邊大小
 1.clientLeft和clientTop
 // 這組屬性可以獲取元素設置了左邊框和上邊框的大小;
     box.clientLeft;                                     // 獲取左邊框的寬度;
2.offsetLeft和offsetTop(偏移量)
// 這組屬性可以獲取當前元素邊框相對于父元素邊框的位置;  box.offsetLeft;                  // 50;  // PS:獲取元素當前相對于父元素的位置,最好將它設置為定位position:absolute;  // PS:加上邊框和內邊距不會影響它的位置,但加上外邊據會累加;  box.offsetParent;                 // 得到父元素;  // PS:offsetParent中,如果本身父元素是<body>,非IE返回body對象,IE返回html對象;  // 如果兩個元素嵌套,如果上級父元素沒有使用定位position:absolute,那么offsetParent將返回body或html對象;// 如果說在很多層次里,外層已經定位,獲取任意一個元素距離頁面上的位置,可以不停的向上回溯獲取累加來實現;  box.offsetTop+box.offsetParent.offsetTop;     // 只有兩層的情況下;  // 如果多層的話,就必須使用循環或遞歸;  function offsetLeft(element){    var left = element.offsetLeft;        // 得到第一層距離;    var parent = element.offsetParent;      // 得到第一個父元素;    while(parent !== null){            // 判斷如果還有上一層父元素;      left += parent.offsetLeft;        // 將得到的距離累加;      parent = parent.offsetParent;       // 將父元素也回溯;    }                       // 然后循環;    return left;                 // 得到最終距離;  }3.scrollTop和scrollLeft
// 這組屬性可以獲取被滾動條隱藏的區域大小,也可設置定位到該區域;  box.scrollTop;                  // 獲取滾動內容上方的位置;// 設置滾動條滾動到最初始的位置;  function scrollStart(element){    if(element.scrollTop != 0){      element.scrollTop = 0;    }  }四 getBoundingClientRect()方法
// 這個方法返回一個矩形對象,包含四個屬性:left/top/right和bottom;// 分別表示元素各邊與頁面上邊和左邊的距離;  var box = document.getElementById('box');  alert(box.getBoundingClientRect().top);    // 元素上邊距離頁面上邊的距離;  alert(box.getBoundingClientRect().right);   // 元素右邊距離頁面左邊的距離;  alert(box.getBoundingClientRect().bottom);   // 元素下邊距離頁面上邊的距離;  alert(box.getBoundingClientRect().left);    // 元素左邊距離頁面左邊的距離;  // PS:IE/Firefox/Opera/Chrome/Safari都支持;  // 但在IE中,默認坐標從(2,2)開始計算,導致最終距離比其他瀏覽器多出兩個像素;  document.documentElement.clientTop;      // 非IE為0,IE為2;  document.documentElement.clientLeft;      // 非IE為0,IE為2;// 兼容getBoundingClientRect()  function getRect(element){    var rect = element.getBoundingClientRect();    var top = document.documentElement.clientTop;    var left = document.documentElement.clientLeft;    return {      top:rect.top-top,           // 元素上邊距-頁面的上邊距(0-0或2-2);      bottom:rect.bottom-top,      left:rect.left-left,         // 元素左邊距-頁面的左邊距(0-0或2-2);      right:rect.right-left    }  };五 小結
1.偏移量(offset dimension):包括元素在屏幕上占用的所有可見的空間;
元素的可見大小由其高度和寬度決定,包括內邊距/滾動條和邊框;
2.客戶區大小(client dimension):指的是元素內容及其內邊距所占據的空間大小;
3.滾動大小(scroll dimension):包含滾動內容的元素的大小;
新聞熱點
疑難解答