You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中获取div相对于父级div而非视口的X/Y坐标?

获取子元素相对于父元素的坐标位置

有两种常用方法可以实现这个需求:

方法一:通过视口位置差值计算

利用getBoundingClientRect()分别获取父、子元素相对于视口的位置,再计算差值,同时处理父元素滚动的情况:

const parent = document.getElementById('parent');
const child = document.getElementById('child');

// 获取元素相对于视口的位置信息
const parentRect = parent.getBoundingClientRect();
const childRect = child.getBoundingClientRect();

// 计算基础相对坐标(父元素无滚动时直接用这个)
let relativeX = childRect.left - parentRect.left;
let relativeY = childRect.top - parentRect.top;

// 如果父元素有滚动条,修正坐标
relativeX += parent.scrollLeft;
relativeY += parent.scrollTop;

console.log(`相对X:${relativeX}px,相对Y:${relativeY}px`);

方法二:利用offsetLeft/offsetTop(需设置父元素定位)

给父元素设置position: relative,让它成为子元素的offsetParent,之后直接读取子元素的offsetLeft和offsetTop即可:

首先给父元素添加CSS样式:

#parent {
  position: relative;
  /* 其他自定义样式 */
}

然后获取坐标:

const child = document.getElementById('child');

const relativeX = child.offsetLeft;
const relativeY = child.offsetTop;

console.log(`相对X:${relativeX}px,相对Y:${relativeY}px`);

注意事项

  • 若父元素有内边距(padding),offsetLeft/offsetTop是从父元素内边距内侧开始计算的,而方法一的差值是从父元素边框外侧到子元素边框外侧的距离,按需选择即可
  • 如果元素使用了transform属性,getBoundingClientRect()会考虑变换后的位置,而offsetLeft/offsetTop不会受transform影响

内容的提问来源于stack exchange,提问作者Jean

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 16:20:35