當(dāng)前位置:首頁(yè) > 嵌入式培訓(xùn) > 嵌入式學(xué)習(xí) > 講師博文 > DOM 元素尺寸與位置
一.獲取元素CSS大小
1.通過(guò)style獲取元素的大小
varbox = document.getElementById('box'); //獲取元素
box.style.width;
box.style.height;
PS:style獲取只能獲取到行內(nèi)style屬性的CSS樣式中的寬和高,如果有,獲取;如果沒(méi)有,則返回空。
2.通過(guò)計(jì)算獲取元素的大小
varstyle = window.getComputedStyle ?
window.getComputedStyle(box,null) : null || box.currentStyle;
style.width; //1424px、200px、auto
style.height; //18px、200px、auto
PS:通過(guò)計(jì)算獲取元素的大小,無(wú)關(guān)你是否是行內(nèi)、內(nèi)聯(lián)或者鏈接,它經(jīng)過(guò)計(jì)算后得到的結(jié)果返回出來(lái)。如果本身設(shè)置大小,它會(huì)返回元素的大小,如果本身沒(méi)有設(shè)置,非IE瀏覽器會(huì)返回默認(rèn)的大小,IE瀏覽器返回auto。
3.通過(guò)CSSStyleSheet對(duì)象中的cssRules(或rules)屬性獲取元素大小
var sheet =document.styleSheets[0]; //獲取link或style
var rule = (sheet.cssRules ||sheet.rules)[0]; //獲取第一條規(guī)則
rule.style.width;
rule.style.height;
PS:cssRules(或rules)只能獲取到內(nèi)聯(lián)和鏈接樣式的寬和高,不能獲取到行內(nèi)和計(jì)算后的樣式。
總結(jié):以上的三種CSS獲取元素大小的方法,只能獲取元素的CSS大小,卻無(wú)法獲取元素本身實(shí)際的大小。比如加上了內(nèi)邊距(padding)、外邊距(margin)、邊框(border)、滾動(dòng)條(scroll)之后的大小
二.獲取元素實(shí)際大小
測(cè)試代碼:
HTML部分:
<body>
<divid="box">
測(cè)Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div
測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div
測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div
測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div
測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div
測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div
測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div
測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div測(cè)試Div
</div>
</body>
CSS部分:
#box{
width:200px;
height:200px;
background:red;
overflow:scroll;
}
1.clientWidth和clientHeight
這組屬性可以獲取元素可視區(qū)的大小,可以得到元素內(nèi)容及內(nèi)邊距所占據(jù)的空間大小。
box.clientWidth; //200
box.clientHeight; //200
PS:返回了元素大小,但沒(méi)有單位,默認(rèn)單位是px,如果設(shè)置了其他的單位,比如100em之類,返回出來(lái)的結(jié)果還會(huì)轉(zhuǎn)換為px像素。(CSS獲取的話,是照著你設(shè)置的樣式獲取)。
PS:對(duì)于元素的實(shí)際大小,clientWidth和clientHeight理解方式如下:
1.增加邊框,無(wú)變化,為200;
2.增加外邊距,無(wú)變化,為200;
3.增加滾動(dòng)條,終值等于原本大小減去滾動(dòng)條的大小,為184;
4.增加內(nèi)邊距,終值等于原本大小加上內(nèi)邊距的大小,為220;
PS:如果說(shuō)沒(méi)有設(shè)置任何CSS的寬和高度,那么非IE瀏覽器會(huì)算上滾動(dòng)條和內(nèi)邊距的計(jì)算后的大小,而IE瀏覽器則返回0。
2.scrollWidth和scrollHeight
這組屬性可以獲取滾動(dòng)內(nèi)容的元素大小。
box.scrollWidth; //200
box.scrollWidth; //200
PS:返回了元素大小,默認(rèn)單位是px。如果沒(méi)有設(shè)置任何CSS的寬和高度,它會(huì)得到計(jì)算后的寬度和高度。
PS:對(duì)于元素的實(shí)際大小,scrollWidth和scrollHeight理解如下
1.增加邊框,不同瀏覽器有不同解釋:
a) Firefox和Opera瀏覽器會(huì)增加邊框的大小,220 x 220
b) Chrome和Safari瀏覽器會(huì)忽略邊框大小,200 x 200
c) IE瀏覽器忽略邊框并且只顯示它有效內(nèi)容的高度,200 x 18(單個(gè)“測(cè)試 Div”的高度為18)
2.增加內(nèi)邊距,終值會(huì)等于原本大小加上內(nèi)邊距大小,220 x 220,IE為220x 38
3.增加滾動(dòng)條,終值會(huì)等于原本大小減去滾動(dòng)條大小,184 x 184,IE為184x 18
4.增加外邊據(jù),無(wú)變化。
5.增加內(nèi)容溢出(若果沒(méi)有滾動(dòng)條,不同瀏覽器兼容不同,所以加上滾動(dòng)條overflow:scroll;),F(xiàn)irefox、Chrome和IE獲取實(shí)際內(nèi)容高度,Opera比前三個(gè)瀏覽器獲取的高度偏小,Safari比前三個(gè)瀏覽器獲取的高度偏大。
3.offsetWidth和offsetHeight(穩(wěn)定,使用頻率高!)
這組屬性可以返回元素實(shí)際大小,包含邊框、內(nèi)邊距和滾動(dòng)條。
box.offsetWidth; //200
box.offsetHeight; //200
PS:返回了元素大小,默認(rèn)單位是px。如果沒(méi)有設(shè)置任何CSS的寬和高度,他會(huì)得到計(jì)算后的寬度和高度。
PS:對(duì)于元素的實(shí)際大小,offsetWidth和offsetHeight理解如下:
1.增加邊框,終值會(huì)等于原本大小加上邊框大小,為220;
2.增加內(nèi)邊距,終值會(huì)等于原本大小加上內(nèi)邊距大小,為220;
3.增加外邊據(jù),無(wú)變化;
4.增加滾動(dòng)條,無(wú)變化,不會(huì)減小;
HTML部分:
<body>
<divid="box">
測(cè)試Div
</div>
</body>
CSS部分:
#box{
width:200px;
height:200px;
background:red;
}
PS:對(duì)于元素大小的獲取,一般是塊級(jí)(block)元素并且以設(shè)置了CSS大小的元素較為方便。如果是內(nèi)聯(lián)元素(inline)或者是沒(méi)有設(shè)置大小的元素就尤為麻煩,所以,建議使用的時(shí)候注意。
三.獲取元素周邊大小
1.clientLeft和clientTop
這組屬性可以獲取元素設(shè)置了左邊框和上邊框的大小。
box.clientLeft; //獲取左邊框的長(zhǎng)度
box.clientTop; //獲取上邊框的長(zhǎng)度
PS:目前只提供了Left和Top這組,并沒(méi)有提供Right和Bottom。如果四條邊寬度不同的話,可以直接通過(guò)計(jì)算后的樣式獲取,或者采用以上三組獲取元素大小的減法求得。
2.offsetLeft和offsetTop
這組屬性可以獲取當(dāng)前元素相對(duì)于父元素的位置。
box.offsetLeft;
box.offsetTop;
PS:獲取元素當(dāng)前相對(duì)于父元素的位置,好將此元素設(shè)置為絕對(duì)定位position:absolute;否則不同的瀏覽器會(huì)有不同的解釋。
PS:加上邊框和內(nèi)邊距不會(huì)影響它的位置,但加上外邊距會(huì)累加。
box.offsetParent; //得到父元素
PS:offsetParent中,如果本身父元素是,非IE返回body對(duì)象,IE返回html對(duì)象。如果兩個(gè)元素嵌套,如果父元素沒(méi)有使用定位position:absolute,那么offsetParent將返回body對(duì)象或html對(duì)象。所以,在獲取offsetLeft和offsetTop時(shí)候,CSS定位很重要。
如果說(shuō),在很多層次里,外層已經(jīng)定位,我們?cè)趺传@取里層的元素距離body或html元素之間的距離呢?也就是獲取任意一個(gè)元素距離頁(yè)面上的位置。那么我們可以編寫函數(shù),通過(guò)不停的向上回溯獲取累加來(lái)實(shí)現(xiàn)。代碼如下:
//只有兩層的情況下:
box.offsetTop+ box.offsetParent.offsetTop;
//如果多層的話,就必須使用循環(huán)或遞歸:
function offsetLeft(element) {
var left = element.offsetLeft; //得到第一層距離
var parent = element.offsetParent; //得到第一個(gè)父元素
while (parent !== null) { //如果還有上一層父元素
left += parent.offsetLeft; //把本層的距離累加
parent = parent.offsetParent; //得到本層的父元素
} //然后繼續(xù)循環(huán)
return left;
}
3.scrollTop和scrollLeft
這組屬性可以獲取滾動(dòng)條被隱藏的區(qū)域大小,也可設(shè)置定位到該區(qū)域。
box.scrollTop; //獲取滾動(dòng)內(nèi)容上方的位置(就是隱藏的內(nèi)容的高度)
box.scrollLeft; //獲取滾動(dòng)內(nèi)容左方的位置
如果要讓滾動(dòng)條滾動(dòng)到初始的位置,那么可以寫一個(gè)函數(shù):
functionscrollStart(element) {
if (element.scrollTop != 0) element.scrollTop = 0; //賦值為0;
}