使用JavaScript查找HTML元素的X/Y坐标

41

如果HTML元素(DIV)的坐标没有被明确设置,我该如何从JavaScript中找到它们的XY坐标?


根据http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-even-though-its-much-newer-and-ha的建议,本问题已被标记为重复。 - user123444555621
6个回答

34

这是我的做法:

// Based on: http://www.quirksmode.org/js/findpos.html
var getCumulativeOffset = function (obj) {
    var left, top;
    left = top = 0;
    if (obj.offsetParent) {
        do {
            left += obj.offsetLeft;
            top  += obj.offsetTop;
        } while (obj = obj.offsetParent);
    }
    return {
        x : left,
        y : top
    };
};

我认为我更喜欢你返回对象的想法,而不是Peter-Paul Koch在他的原始解决方案中返回数组的选择。 - cssimsek

9

这可能会因浏览器和版本而有所不同。我建议使用jQuery和positions插件。


9
大多数位置插件现在已经成为jQuery核心的一部分。因此,您只需执行$(element).offset({relativeTo: "body"}) - 它将向您提供对象相对于body的顶部和左侧位置。 - Sugendran
太好了,我已经好几个月没下载jQuery了,知道他们将其卷入其中真是太棒了。 - palehorse

7
你可以使用类似Prototype或jQuery的库,或者你可以使用这个方便的函数:findpos。它返回一个数组。
myPos = findPos(document.getElementById('something'))
x = myPos[0]
y = myPos[1]

function findPos(obj) {
  var curleft = curtop = 0;
  if (obj.offsetParent) {
    curleft = obj.offsetLeft
    curtop = obj.offsetTop
    while (obj = obj.offsetParent) {
      curleft += obj.offsetLeft
      curtop += obj.offsetTop
    }
  }
  return [curleft,curtop];
}

你应该归功于quirksmode.org,那个函数看起来非常熟悉。 - pilsetnieks

3

以下是一种递归版本的实现:

function findPos(element) {
  if (element) {
    var parentPos = findPos(element.offsetParent);
    return [
      parentPos.X + element.offsetLeft,
      parentPos.Y + element.offsetTop
    ];
  } else {
    return [0,0];
  }
}

parentPos.X 应该改为 parentPos[0], parentPos.Y 应该改为 parentPos[1]。 - Noah

2
您可以向Element.prototype添加两个属性,以获取任何元素的顶部/左侧位置。
window.Object.defineProperty( Element.prototype, 'documentOffsetTop', {
    get: function () { return this.offsetTop + ( this.offsetParent ? this.offsetParent.documentOffsetTop : 0 ); }
} );

window.Object.defineProperty( Element.prototype, 'documentOffsetLeft', {
    get: function () { return this.offsetLeft + ( this.offsetParent ? this.offsetParent.documentOffsetLeft : 0 ); }
} );

这里有一个演示,展示了与jQuery的offset().top.left的结果比较: http://jsfiddle.net/ThinkingStiff/3G7EZ/

-1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接