一.獲取元素CSS大小
1.通過style獲取元素的大小
varbox = document.getElementById('box'); //獲取元素
box.style.width;
box.style.height;
PS:style獲取只能獲取到行內style屬性的CSS樣式中的寬和高,如果有,獲取;如果沒有,則返回空。
2.通過計算獲取元素的大小
varstyle = window.getComputedStyle ?
window.getComputedStyle(box,null) : null || box.currentStyle;
style.width; //1424px、200px、auto
style.height; //18px、200px、auto
PS:通過計算獲取元素的大小,無關你是否是行內、內聯或者鏈接,它經過計算后得到的結果返回出來。如果本身設置大小,它會返回元素的大小,如果本身沒有設置,非IE瀏覽器會返回默認的大小,IE瀏覽器返回auto。
3.通過CSSStyleSheet對象中的cssRules(或rules)屬性獲取元素大小
var sheet =document.styleSheets[0]; //獲取link或style
var rule = (sheet.cssRules ||sheet.rules)[0]; //獲取第一條規則
rule.style.width;
rule.style.height;
PS:cssRules(或rules)只能獲取到內聯和鏈接樣式的寬和高,不能獲取到行內和計算后的樣式。
總結:以上的三種CSS獲取元素大小的方法,只能獲取元素的CSS大小,卻無法獲取元素本身實際的大小。比如加上了內邊距(padding)、外邊距(margin)、邊框(border)、滾動條(scroll)之后的大小
二.獲取元素實際大小
測試代碼:
HTML部分:
<body>
<divid="box">
測Div測試Div測試Div測試Div測試Div測試Div測試Div測試Div
測試Div測試Div測試Div測試Div測試Div測試Div測試Div測試Div
測試Div測試Div測試Div測試Div測試Div測試Div測試Div測試Div
測試Div測試Div測試Div測試Div測試Div測試Div測試Div測試Div
測試Div測試Div測試Div測試Div測試Div測試Div測試Div測試Div
測試Div測試Div測試Div測試Div測試Div測試Div測試Div測試Div
測試Div測試Div測試Div測試Div測試Div測試Div測試Div測試Div
測試Div測試Div測試Div測試Div測試Div測試Div測試Div測試Div
</div>
</body>
CSS部分:
#box{
width:200px;
height:200px;
background:red;
overflow:scroll;
}
1.clientWidth和clientHeight
這組屬性可以獲取元素可視區的大小,可以得到元素內容及內邊距所占據的空間大小。
box.clientWidth; //200
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
這組屬性可以獲取滾動內容的元素大小。
box.scrollWidth; //200
box.scrollWidth; //200
PS:返回了元素大小,默認單位是px。如果沒有設置任何CSS的寬和高度,它會得到計算后的寬度和高度。
PS:對于元素的實際大小,scrollWidth和scrollHeight理解如下
1.增加邊框,不同瀏覽器有不同解釋:
a) Firefox和Opera瀏覽器會增加邊框的大小,220 x 220
b) Chrome和Safari瀏覽器會忽略邊框大小,200 x 200
c) IE瀏覽器忽略邊框并且只顯示它有效內容的高度,200 x 18(單個“測試 Div”的高度為18)
2.增加內邊距,終值會等于原本大小加上內邊距大小,220 x 220,IE為220x 38
3.增加滾動條,終值會等于原本大小減去滾動條大小,184 x 184,IE為184x 18
4.增加外邊據,無變化。
5.增加內容溢出(若果沒有滾動條,不同瀏覽器兼容不同,所以加上滾動條overflow:scroll;),Firefox、Chrome和IE獲取實際內容高度,Opera比前三個瀏覽器獲取的高度偏小,Safari比前三個瀏覽器獲取的高度偏大。
3.offsetWidth和offsetHeight(穩定,使用頻率高!)
這組屬性可以返回元素實際大小,包含邊框、內邊距和滾動條。
box.offsetWidth; //200
box.offsetHeight; //200
PS:返回了元素大小,默認單位是px。如果沒有設置任何CSS的寬和高度,他會得到計算后的寬度和高度。
PS:對于元素的實際大小,offsetWidth和offsetHeight理解如下:
1.增加邊框,終值會等于原本大小加上邊框大小,為220;
2.增加內邊距,終值會等于原本大小加上內邊距大小,為220;
3.增加外邊據,無變化;
4.增加滾動條,無變化,不會減小;
HTML部分:
<body>
<divid="box">
測試Div
</div>
</body>
CSS部分:
#box{
width:200px;
height:200px;
background:red;
}
PS:對于元素大小的獲取,一般是塊級(block)元素并且以設置了CSS大小的元素較為方便。如果是內聯元素(inline)或者是沒有設置大小的元素就尤為麻煩,所以,建議使用的時候注意。
三.獲取元素周邊大小
1.clientLeft和clientTop
這組屬性可以獲取元素設置了左邊框和上邊框的大小。
box.clientLeft; //獲取左邊框的長度
box.clientTop; //獲取上邊框的長度
PS:目前只提供了Left和Top這組,并沒有提供Right和Bottom。如果四條邊寬度不同的話,可以直接通過計算后的樣式獲取,或者采用以上三組獲取元素大小的減法求得。
2.offsetLeft和offsetTop
這組屬性可以獲取當前元素相對于父元素的位置。
box.offsetLeft;
box.offsetTop;
PS:獲取元素當前相對于父元素的位置,好將此元素設置為絕對定位position:absolute;否則不同的瀏覽器會有不同的解釋。
PS:加上邊框和內邊距不會影響它的位置,但加上外邊距會累加。
box.offsetParent; //得到父元素
PS:offsetParent中,如果本身父元素是,非IE返回body對象,IE返回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;
}
3.scrollTop和scrollLeft
這組屬性可以獲取滾動條被隱藏的區域大小,也可設置定位到該區域。
box.scrollTop; //獲取滾動內容上方的位置(就是隱藏的內容的高度)
box.scrollLeft; //獲取滾動內容左方的位置
如果要讓滾動條滾動到初始的位置,那么可以寫一個函數:
functionscrollStart(element) {
if (element.scrollTop != 0) element.scrollTop = 0; //賦值為0;
}