<div>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>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>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;
}