JavaScript获取元素相对于文档坐标的两种方法:offsetParent累加与getBoundingClientRect

作者:竹影时间:2026-10-28 01:37:50浏览:102

本文介绍JavaScript中获取元素相对于文档区域坐标的两种实现方式。第一种通过循环累加offsetParent的offsetLeft和offsetTop,兼容性好但性能较低;第二种利用getBoundingClientRect方法直接获取视口坐标并加上滚动距离,效率更高且支持现代浏览器。文章包含完整代码示例及注意事项,帮助开发者根据需求选择合适方案。

获取元素文档坐标的方法概述

阐述获取页面元素相对于文档区域document的横向与纵向坐标的两种实现方案及对比分析


在JavaScript控制元素运动时,获取页面元素的坐标位置是常见需求,此处主要归纳两种方法:



一:通过累加元素对象及其offsetParent(若存在)的offsetLeft/offsetTop属性实现

参考《JavaScript高级程序设计》第三版DOM章节,获取元素在页面上的偏移量需将该元素的offsetLeft和offsetTop与其offsetParent的对应属性累加,直至根元素。因此,获取元素到文档区域的坐标,可通过while循环不断累加offsetParent的offsetLeft/offsetTop,直到offsetParent为null。


js代码:

代码实现如下:

 
// 计算元素到文档区域的坐标
function getPosition(element) {
var actualLeft = element.offsetLeft,
actualTop = element.offsetTop,
current = element.offsetParent; // 获取元素的offsetParent
// 循环直至到达根元素
while (current !== null) {
actualLeft += current.offsetLeft;
actualTop += current.offsetTop;
current = current.offsetParent;
} 
// 返回包含left和top坐标的对象
return {
left: actualLeft,
top: actualTop
}; 
} 

示例截图:

获取元素文档坐标的方法概述 Firebug测试截图:(注:其他浏览器已通过测试!)

获取元素文档坐标的方法概述

基于getBoundingClientRect的高效实现

二:利用 getBoundingClientRect() 方法实现 getBoundingClientRect方法用于获取页面中某个元素的左、上、右和下分别相对浏览器视窗window的位置。该方法返回一个包含top、left、right、bottom四个属性的对象。此方法原为IE专有,但FF3.0+和Opera9.5+已支持,显著提高了获取页面元素位置的效率。此外,该方法无需while循环,直接获取数值,性能优于第一种方法,尤其在复杂页面中效果明显。 js代码:

代码实现如下:

 
// 计算元素到文档区域的坐标
function getPosition(element){
var dc = document,
rec = element.getBoundingClientRect(),
_x = rec.left, // 获取元素相对浏览器视窗window的左、上坐标
_y = rec.top;
// 加上html或body元素的滚动距离,即为元素相对于文档区域document的坐标
_x += dc.documentElement.scrollLeft || dc.body.scrollLeft;
_y += dc.documentElement.scrollTop || dc.body.scrollTop;
return {
left: _x,
top: _y
}; 
} 

经测试,该方法与第一种方法获取元素相对于document的坐标结果一致,但在低版本IE浏览器中存在差异。



注意:务必累加上html(IE除外)或body(针对IE)元素的水平或垂直滚动距离!


结语:上文已阐述如何获取元素相对于文档区域document的坐标位置。如遇问题,可联系作者或发表评论。此外,获取右坐标right和下坐标bottom,只需将left、top坐标分别加上元素宽度(elem.offsetWidth)和高度(elem.offsetHeight)。鉴于offsetWidth、offsetHeight包含内边距和边框,推荐使用getBoundingClientRect方法。补充说明:利用该方法返回对象的right-left等于元素宽度,bottom-top等于元素高度,可获取不含边框的元素本身宽高。

作者最新文章