首頁 > web前端 > js教程 > JavaScript取得元素尺寸和大小操作總結_javascript技巧

JavaScript取得元素尺寸和大小操作總結_javascript技巧

WBOY
發布: 2016-05-16 16:12:28
原創
993 人瀏覽過

一、取得元素的行內樣式

複製程式碼 程式碼如下:

var obj = document.getElementById("test");
alert(obj.height "n" obj.width);
// 200px 200px typeof=string只是將style屬性中的值顯示出來

二、取得計算後的樣式

複製程式碼 程式碼如下:

var obj = document.getElementById("test");
var style = null;
if (window.getComputedStyle) {
    style = window.getComputedStyle(obj, null);    // 非IE
} else {
    style = obj.currentStyle;  // IE
}
alert("width=" style.width "nheight=" style.height);

注意:如果不設定元素的寬度和高度,那麼在非IE瀏覽器下傳回預設的寬度和高度。在IE下面返回auto字串

三、取得

複製程式碼 程式碼如下:

var obj = document.styleSheets[0]; // [object StyleSheetList] 樣式表的數量var rule = null;// [object CSSRule]
if (obj.cssRules){
    rule = obj.cssRules[0];  // 非IE [object CSSRuleList]
} else {
    rule = obj.rules[0];     // IE [object CSSRuleList]
}
alert(rule.style.width);

cssRules(或rules)只能取得到內聯和連結樣式的寬和高,不能取得到行內和計算後的樣式。

總結:以上的三種CSS取得元素大小的方法,只能取得元素的CSS大小,卻無法取得元素本身實際的大小。例如加上了內邊距、捲軸之類的。

四、取得元素的實際大小

1. clientWidth和clientHeight
    這群屬性可以取得元素視覺區的大小,可以得到元素內容及內邊距所佔據的空間大小。回傳了元素大小,但沒有單位,預設單位是px,如果你強行設定了單位,例如100em之類,它還是會回傳px的大小。 (CSS取得的話,是照著你設定的樣式取得)。對於元素的實際大小,clientWidth和clientHeight理解方式如下:
    a. 增加邊框,無變化;
    b. 增加外邊距,無變化;
    c. 增加捲軸,最終值等於原本大小減去捲軸的大小;
    d. 增加內邊距,最終值等於原本大小加上內邊距的大小;

複製程式碼 程式碼如下:


#test{
    background-color: green;
    width: 200px;
    height: 200px;
    border: solid 5px red;  /* 對應a理解,結果:200,200 */
    margin: 10px;  /* 對應b理解,結果:200,200*/
    padding: 20px;  /* 對應c理解,結果:240,240*/
    overflow: scroll;  /* 對應d理解,結果:223,223,223=200(css大小) 40(兩邊內邊距)-17(滾動條寬度)*/
}
window.onload = function(){
    var obj = document.getElementById("test");
    alert(obj.clientWidth "," obj.clientHeight);
};

注意:如果說沒有設定任何CSS的寬和高度,那麼非IE瀏覽器會算上滾動條和內邊距的計算後的大小,而IE瀏覽器則回傳0(IE8已修復)。

2. scrollWidth和scrollHeight
    這組屬性可以取得滾動內容(可見內容)的元素大小。傳回了元素大小,預設單位是px。如果沒有設定任何CSS的寬和高度,它會得到計算後的寬度和高度。對於元素的實際大小,scrollWidth和scrollHeight理解如下:
    1. 增加邊框,不同瀏覽器有不同解釋(下面在IE8中運作正常,IE6運作不正常):
a) Firefox和Opera瀏覽器會增加邊框的大小,220x220
b) IE、Chrome和Safari瀏覽器會忽略邊框大小,200x200
c) IE瀏覽器只顯示它本來內容的高度,200x18(IE8已經修改這個問題)
    2. 增加內邊距,最終值會等於原本大小加上內邊距大小,220x220,IE為220x38
    3. 增加捲軸,最終值會等於原本大小減去捲軸大小,184x184,IE為184x18
    4. 增加外邊邊據,無變動。
    5. 增加內容溢出,Firefox、Chrome和IE取得實際內容高度,Opera比前三個瀏覽器取得的高度偏小,Safari比前三個瀏覽器取得的高度偏大。

3. offsetWidth和offsetHeight
    這組屬性可以傳回元素實際大小,包含邊框、內邊距和捲軸。傳回了元素大小,預設單位是px。如果沒有設定任何CSS的寬和高度,他會得到計算後的寬度和高度。對於元素的實際大小,offsetWidth和offsetHeight理解如下:
    1.增加邊框,最終值會等於原本大小加上邊框大小,為220;
    2.增加內邊距,最終值會等於原本大小加上內邊距大小,為220;
    3.增加外邊據,無變動;
    4.增加捲軸,無變化,不會減少;
    對於元素大小的獲取,一般是區塊級(block)元素並且以設定了CSS大小的元素較為方便。如果是內聯元素(inline)或沒有設定大小的元素就特別麻煩,所以,建議使用的時候要注意。

複製程式碼 程式碼如下:

test div element

#test{
    background-color: green;
    width: 200px;
    height: 200px;
    border: solid 10px red; /*結果:220,220*/
    margin: 10px; /*結果:220,220(無變化)*/
    padding: 10px; /*結果:240,240*/
    overflow:scroll; /*結果:240,240(無變化)*/
}
window.onload = function(){
    var obj = document.getElementById("test");
    alert(obj.offsetWidth "," obj.offsetHeight);
};

五、取得元素週邊大小
1. clientLeft和clientTop取得邊框大小
    這組屬性可以取得元素設定了左邊框和上邊框的大小。目前只提供了Left和Top這組,並沒有提供Right和Bottom。如果四條邊寬度不同的話,可以直接透過計算後的樣式獲取,或者採用以上三組獲取元素大小的減法求得。
右邊框的寬度:obj.offsetWidth-obj.clientWidth-obj.clientLeft
底邊框的寬度:obj.offsetHeight-obj.clientHeight-obj.clientTop

複製程式碼 程式碼如下:

test div element

#test{
    background-color: green;
    width: 200px;
    height: 200px;
    border-top: solid 10px red;s
    border-right: solid 20px #00ff00;
    border-bottom: solid 30px blue;
    border-left: solid 40px #808080;
}
window.onload = function(){
    var obj = document.getElementById("test");
    alert(obj.clientLeft "," obj.clientTop); // 40,10
};

2. offsetLeft和offsetTop   
    這組屬性可以取得目前元素相對於父元素的位置。取得元素目前相對於父元素的位置,最好將它設定為定位position:absolute;否則不同的瀏覽器會有不同的解釋。
a、將position設定為absolute,則所有瀏覽器傳回相同的值。如:

複製程式碼 程式碼如下:

test div element

#test{
    background-color: green;
    width: 200px;
    height: 200px;
    position: absolute;
    left: 30px;
    top: 20px;
}
window.onload = function(){
    var obj = document.getElementById("test");
    alert(obj.offsetLeft "," obj.offsetTop); // 30, 20
};

b、加上邊框和內邊距不會影響它的位置,但加上外邊據會累積。

3、box.offsetParent得到父元素
    offsetParent中,如果本身父元素是

,非IE回傳body對象,IE(IE6)返回html對象。如果兩個元素嵌套,如果上父元素沒有使用定位position:absolute,那麼offsetParent將傳回body物件或html物件。所以,在取得offsetLeft和offsetTop時候,CSS定位很重要。
    如果說,在很多層次裡,外層已經定位,我們要怎麼取得裡層的元素距離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;
}

4.scrollTop和scrollLeft
    這組屬性可以取得捲軸被隱藏(捲軸上方區域)的區域大小,也可設定定位到該區域。如果要讓捲軸滾動到最初始的位置,那麼可以寫一個函數:

複製程式碼 程式碼如下:

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

5、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);         // 元素左邊距離頁面左邊的距離

注意:IE、Firefox3 、Opera9.5、Chrome、Safari支持,在IE中,預設座標從(2,2)開始計算,導致最終距離比其他瀏覽器多出兩個像素,我們需要做個相容。

複製程式碼 程式碼如下:

document.documentElement.clientTop; //非IE為0,IE為2
document.documentElement.clientLeft; //非IE為0,IE為2
functiongGetRect (element) {
    var rect = element.getBoundingClientRect();
    var top = document.documentElement.clientTop;
    var left= document.documentElement.clientLeft;
    return{
        top  :   rect.top - top,
        bottom  :   rect.bottom - top,
        left  :   rect.left - left,
        right  :    rect.right - left
    }
}

分別加上外邊據、內邊距、邊框和捲軸,用來測試所有瀏覽器是否一致。

以上就是本文所述的全部內容了,希望小夥伴們能夠喜歡。

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板