一、獲取元素的行內樣式
復制代碼 代碼如下:
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字符串
三、獲取<link>和<style>標簽寫入的樣式
復制代碼 代碼如下:
var obj = document.styleSheets[0]; // [object StyleSheetList] 樣式表的個數<link>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. 增加內邊距,最終值等於原本大小加上內邊距的大小;
復制代碼 代碼如下:
<div id="test"></div>
#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)或者沒有設置大小的元素就尤為麻煩,所以,建議使用的時候注意。
復制代碼 代碼如下:
<div id="test">test div element</div>
#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
復制代碼 代碼如下:
<div id="test">test div element</div>
#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,則所有浏覽器返回一樣的值。如:
復制代碼 代碼如下:
<div id="test">test div element</div>
#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中,如果本身父元素是<body>,非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
}
}
分別加上外邊據、內邊距、邊框和滾動條,用於測試所有浏覽器是否一致。
以上就是本文所述的全部內容了,希望小伙伴們能夠喜歡。