获取div / span标记的位置

时间:2008-11-13 23:07:16

标签: javascript html

有人可以告诉我如何获得top&未指定时,leftdiv元素的span位置?

即:

<span id='11a' style='top:55px;' onmouseover="GetPos(this);">stuff</span>
<span id='12a' onmouseover="GetPos(this);">stuff</span>

在上面,如果我这样做:

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

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

我在页面上有一堆div / span我无法指定top / left属性,但我需要显示{{ 1}}直接在该元素下。

6 个答案:

答案 0 :(得分:171)

您可以在对元素的引用上调用方法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;

答案 1 :(得分:95)

此函数将告诉您元素相对于页面的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;

答案 2 :(得分:12)

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

编辑:为document.ready切换window.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 );
});

答案 3 :(得分:12)

虽然@ nickf的答案有效。如果您不关心旧浏览器,则可以使用此纯Javascript版本。适用于IE9 +和其他

var rect = el.getBoundingClientRect();

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

答案 4 :(得分:9)

对于任何只需要顶部或左侧位置的人来说,对@ 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;
}

答案 5 :(得分:1)

我意识到这是一个老话题,但@alex的答案需要被标记为正确的答案

element.getBoundingClientRect()与jQuery&#39; s $(element).offset()

完全匹配

它与IE4 +兼容...... https://developer.mozilla.org/en-US/docs/Web/API/Element.getBoundingClientRect