JavaScript DOM元素尺寸与位置获取详解
本文详细解析JavaScript中获取DOM元素尺寸与位置的多种方法。涵盖通过style、getComputedStyle及cssRules读取CSS大小,以及利用client/scroll/offset系列属性获取可视区、滚动内容及实际占用空间。此外,还介绍了获取边框位置、滚动偏移及元素在页面绝对坐标的getBoundingClientRect()用法,帮助开发者精准控制页面布局。
获取元素的CSS大小
一、获取元素的CSS尺寸
1. 通过内联样式获取元素尺寸
代码示例如下:
var box = document.getElementById('box'); // 获取元素引用;
box.style.width; // 返回 '200px';
box.style.height; // 返回 '200px';
// 注意:style属性仅能读取行内CSS样式中的宽高,若未设置则返回空字符串;
2. 通过计算样式获取元素尺寸
代码示例如下:
var style = window.getComputedStyle ? window.getComputedStyle(box, null) : box.currentStyle;
style.width; // 返回 '200px';// 注意:计算样式获取的是最终渲染后的结果,无论样式来源是行内、嵌入还是外部链接;
// 若元素已设置尺寸,则返回该值;若未设置,非IE浏览器返回默认计算值,IE浏览器返回 'auto';
3. 通过CSSStyleSheet对象的cssRules(或rules)属性获取元素尺寸;
代码示例如下:
var sheet = document.styleSheets[0]; // 获取link或style标签;
var rule = (sheet.cssRules || sheet.rules)[0]; // 获取第一条样式规则;
rule.style.width; // 返回 '200px';// 注意:cssRules仅能获取嵌入或链接样式中的宽高,无法获取行内样式或计算后的样式;
总结:上述三种方法仅能获取元素的CSS定义尺寸,无法反映包含内边距、边框或滚动条的实际物理尺寸;
获取元素实际大小
二、获取元素实际物理尺寸
1. clientWidth和clientHeight属性
这组属性用于获取元素可视区域的大小,包含内容区域及内边距所占空间; box.clientWidth; // 返回数值 '200'; // 注意:返回值不含单位,默认单位为像素(px); // 关于实际尺寸的理解: 1. 增加边框宽度,数值不变,仍为 '200'; 2. 增加外边距,数值不变,仍为 '200'; 3. 增加滚动条,最终值 = 原始大小 - 滚动条宽度,例如 '184'; 4. 增加内边距,最终值 = 原始大小 + 内边距宽度,例如 '220'; // 注意:若未设置CSS宽高,非IE浏览器会计算滚动条和内边距后的值,而IE浏览器返回 '0';
2. scrollWidth和scrollHeight属性
这组属性用于获取无滚动条状态下,元素内容的总高度; box.scrollWidth; // 注意:返回值默认单位为像素(px);若未设置CSS宽高,则返回计算后的宽高值;
3. offsetWidth和offsetHeight属性
这组属性用于返回元素的实际物理尺寸,包含边框、内边距及滚动条; box.offsetWidth; // 返回 '200' // 注意:返回值默认单位为像素(px);若未设置CSS宽高,则返回计算后的宽高值; // 关于实际尺寸的理解: 1. 增加边框,最终值 = 原始大小 + 边框宽度,例如 '220'; 2. 增加内边距,最终值 = 原始大小 + 内边距宽度,例如 '220'; 3. 增加外边距,数值无变化; 4. 增加滚动条,数值无变化,不会减小;
// 注意:获取元素尺寸时,针对已设置CSS尺寸且为块级(block)显示的元素最为便捷;
获取元素周边大小
三、获取元素周边偏移与滚动大小
1. clientLeft和clientTop属性 // 这组属性用于获取元素左侧边框和顶部边框的宽度; box.clientLeft; // 获取左边框宽度;
2. offsetLeft和offsetTop属性(偏移量)
// 这组属性可以获取当前元素边框相对于父元素边框的位置;
box.offsetLeft; // 50;
// PS:获取元素当前相对于父元素的位置,最好将它设置为定位position:absolute;
// PS:加上边框和内边距不会影响它的位置,但加上外边据会累加;
box.offsetParent; // 得到父元素;
// PS:offsetParent中,如果本身父元素是<body>,非IE返回body对象,IE返回html对象;
// 如果两个元素嵌套,如果上级父元素没有使用定位position:absolute,那么offsetParent将返回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; // 获取滚动内容上方的位置;
// 设置滚动条滚动到最初始的位置;
function scrollStart(element){
if(element.scrollTop != 0){
element.scrollTop = 0;
}
}
四、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); // 元素左边距离页面左边的距离;
// PS:IE/Firefox/Opera/Chrome/Safari都支持;
// 但在IE中,默认坐标从(2,2)开始计算,导致最终距离比其他浏览器多出两个像素;
document.documentElement.clientTop; // 非IE为0,IE为2;
document.documentElement.clientLeft; // 非IE为0,IE为2;
// 兼容getBoundingClientRect()
function getRect(element){
var rect = element.getBoundingClientRect();
var top = document.documentElement.clientTop;
var left = document.documentElement.clientLeft;
return {
top:rect.top-top, // 元素上边距-页面的上边距(0-0或2-2);
bottom:rect.bottom-top,
left:rect.left-left, // 元素左边距-页面的左边距(0-0或2-2);
right:rect.right-left
}
};
getBoundingClientRect()方法
五、小结
小结
1. 偏移尺寸(offset dimension):指元素在屏幕上占用的所有可见空间; 元素的可见大小由其高度和宽度决定,包含内边距、滚动条及边框; 2. 客户区尺寸(client dimension):指元素内容及其内边距所占据的空间大小; 3. 滚动尺寸(scroll dimension):指包含滚动内容的元素的大小;
vtk.js 渲染窗口黑屏或无内容显示的常见原因及排查
2026-11-05 17:30:30
js-cookie 安装与基础用法:set、get、remove 详解
2026-11-05 16:35:06
适合JavaScript初学者的实战项目:制作简易待办事项列表
2026-11-05 16:17:07
JS打开新标签页时怎么通过URL传递参数
2026-11-05 12:21:08
sigma.js 自定义节点样式:设置颜色、大小及标签显示的技巧
2026-11-05 09:55:00
