在上面,如果我这样做:

document.getElementById('11a').style.top

的值55px被返回。但是,如果我为span'12a'尝试这样做,则不会返回任何内容。

在页面上有一堆div/ spans,我无法为其指定top/left属性,但我需要div直接在该元素下显示一个

6个回答

您可以getBoundingClientRect()在对元素的引用上调用该方法然后,你可以检查topleftright和/或bottom属性...

var offsets = document.getElementById('11a').getBoundingClientRect();
var top = offsets.top;
var left = offsets.left;

如果使用 jQuery,则可以使用更简洁的代码...

var offsets = $('#11a').offset();
var top = offsets.top;
var left = offsets.left;
还要注意,getBoundingClientRect考虑transform到。
2021-03-29 22:49:16
请注意,getBoundingClientRect()返回值相对于视口,而不是文档。为此,您需要类似top = el.getBoundingClientRect().top + window.pageYOffset - el.ownerDocument.documentElement.clientTop.
2021-03-31 22:49:16
+1 对于这个答案,getBoundingClientRect()应该使用 - 这应该是公认的答案!但你并不需要一个“现代浏览器”这个工作,看到兼容性列表我这里显示:stackoverflow.com/questions/1480133/...它适用于 IE 4.0+ (!)、Chrome 1.0+、FF 3.0+、Safari 4.0+ 和 Opera。
2021-04-03 22:49:16
如果第一个非绝对定位的孩子有 margin-top 或 margin-left,这是不准确的。此页面目前没有准确的解决方案,所以如果有人知道,请发布答案。
2021-04-05 22:49:16

这个函数会告诉你元素相对于页面的 x,y 位置。基本上你必须遍历所有元素的父元素并将它们的偏移量加在一起。

function getPos(el) {
    // yay readability
    for (var lx=0, ly=0;
         el != null;
         lx += el.offsetLeft, ly += el.offsetTop, el = el.offsetParent);
    return {x: lx,y: ly};
}

但是,如果您只想要元素相对于其容器的 x,y 位置,那么您只需要:

var x = el.offsetLeft, y = el.offsetTop;

要将元素直接放在此元素下方,您还需要知道其高度。这存储在 offsetHeight/offsetWidth 属性中。

var yPositionOfNewElement = el.offsetTop + el.offsetHeight + someMargin;
@DavidFariña 为此我使用了 dojo 的几何module“dom-geometry”。我不知道如何在本地做到这一点。
2021-03-14 22:49:16
谢谢@IsaacBolinger 刚刚注意到它。有人可以告诉我如何在调整窗口大小或用户滚动时更改值吗?
2021-03-22 22:49:16
只是对使用此代码的用户的警告。这是相对于页面而不是窗口。如果用户使用滚动条滚动,它返回相同的值。当心。
2021-03-24 22:49:16
不幸的是,当元素位于带边框的表格内时,此方法在 Chrome 中失败。由于 BODY 边距,它也会在 IE6 标准模式下失败。
2021-03-27 22:49:16
否决 - 对于更有经验的用户来说可能很明显,但您没有指定确切需要为 el 传递的内容(即请提供示例用法)。
2021-04-01 22:49:16

虽然@nickf 的回答有效。如果你不关心旧浏览器,你可以使用这个纯 Javascript 版本。适用于 IE9+ 等

var rect = el.getBoundingClientRect();

var position = {
  top: rect.top + window.pageYOffset,
  left: rect.left + window.pageXOffset
};

正如 Alex 所指出的,您可以使用 jQuery offset() 来获取相对于文档流的位置。使用 position() 作为其相对于父级的 x,y 坐标。

编辑:切换document.readywindow.load因为load等待所有元素,因此您可以获得它们的大小,而不是简单地准备 DOM。根据我的经验,load导致 Javascript 定位错误的元素更少。

$(window).load(function(){ 
  // Log the position with jQuery
  var position = $('#myDivInQuestion').position();
  console.log('X: ' + position.left + ", Y: " + position.top );
});

对于只需要顶部或左侧位置的任何人,对@Nickf 的可读代码稍作修改即可解决问题。

function getTopPos(el) {
    for (var topPos = 0;
        el != null;
        topPos += el.offsetTop, el = el.offsetParent);
    return topPos;
}

function getLeftPos(el) {
    for (var leftPos = 0;
        el != null;
        leftPos += el.offsetLeft, el = el.offsetParent);
    return leftPos;
}
其它你可能感兴趣的问题
上一篇如何获取包含当前选择的 DOM 元素? 下一篇如何使用 JavaScript 更改 HTML 选定选项?