通过 JavaScript 获取元素的位置

Posted

技术标签:

【中文标题】通过 JavaScript 获取元素的位置【英文标题】:Get position of element by JavaScript 【发布时间】:2010-12-18 16:21:26 【问题描述】:

我见过很多可以捕捉页面内元素/对象的 x 和 y 位置的脚本。但是当网页在正文或其他元素、绝对/相对元素等使用边距时,我总是无法捕捉 x 和 y。

无论使用什么边距或填充,是否有提供准确位置的解决方案?

【问题讨论】:

【参考方案1】:

我使用以下代码将 div 框移动到 Web IME site 中跟随光标

function xy(x) 
    o = document.getElementById(x);
    var l =o.offsetLeft; var t = o.offsetTop;
    while (o=o.offsetParent)
        l += o.offsetLeft;
    o = document.getElementById(x);
    while (o=o.offsetParent)
        t += o.offsetTop;
    return [l,t];

它返回一个数组[left,top],

【讨论】:

嗨,马克,感谢您的代码,但是当页面在正文处有边距时,位置不再正确,您有解决方案吗?提前致谢 在返回值中添加document.body.offsetLeftdocument.body.offsetTop 怎么样? 无论正文边距如何,这都应该可以正常工作。确保您使用的是标准模式文档类型。在 Quirks 中,所有的赌注都被取消了。 谢谢马克,我会试试那个! @Bobince,我无法控制将发布此代码的网站,这是交互式广告的一部分。 如果可以在一个循环中同时获得offsetLeftoffsetTop,为什么还要向上遍历DOM 树两次?【参考方案2】:

获取确切位置只需将 offsetLefts 和 offsetTops 递归添加到 offsetParents:

function getPos(ele)
    var x=0;
    var y=0;
    while(true)
        x += ele.offsetLeft;
        y += ele.offsetTop;
        if(ele.offsetParent === null)
            break;
        
        ele = ele.offsetParent;
    
    return [x, y];

顺便说一句,这个解决方案的运行速度可能比the other solution above 快两倍,因为我们只循环一次。

【讨论】:

@YOUs 的代码可以大大简化,使它们大致相同,而他的代码会更简洁。【参考方案3】:

你的代码非常糟糕,我对 Pacerier 的代码有一些改进,所以我会发布我自己的答案:

function getPos(el, rel)

    var x=0, y=0;
    do 
        x += el.offsetLeft;
        y += el.offsetTop;
        el = el.offsetParent;
    
    while (el != rel)
    return x:x, y:y;

如果只是用作getPos(myElem) 将返回全局位置。如果包含第二个元素作为参数(即getPos(myElem, someAncestor)),它是第一个元素的祖先/父级(至少在链上的某处),那么它将给出相对于该祖先的位置。如果没有给出rel(即留下undefined),那么它会故意使用!= 而不是!==,因为当el 到达null 并且relundefined 时它应该停止好吧,所以非严格相等是有目的的,不要改变它。它还返回一个对象,因为它在使用上比数组更具可读性(因此您可以执行getPos().x 之类的操作)。

这是来自 Pacerier 的解决方案,所以如果您要对此表示赞同,请考虑也支持他的解决方案。

【讨论】:

【参考方案4】:

offsetParent 和其他偏移函数是旧的......使用getBoundingClientRect 函数...使用这个:

function getAbsPosition(element) 
   var rect = element.getBoundingClientRect();
   return x:rect.left,y:rect.top

现在你可以像这样使用它了

<div style="margin:50px;padding:50px;" id="myEl">lol</div>
<script type="text/javascript">
    var coords = getAbsPosition( document.getElementById('myEl') );
    alert( coords.x );alert( coords.y );
</script>

别担心...无论元素有多少边距、位置或填充,它总是有效的

【讨论】:

这将根据当前滚动调整数字。因此,如果您向下滚动 50px,它将减少 50px。

以上是关于通过 JavaScript 获取元素的位置的主要内容,如果未能解决你的问题,请参考以下文章

js怎么获取数组中元素的位置?

JavaScript中提供获取HTML元素位置的属性:

JavaScript获取DOM元素位置和尺寸大小

JavaScript获取DOM元素位置和尺寸大小

使用 JavaScript 获取 2 个 DOM 元素之间的相对位置

JavaScript获取DOM元素位置和尺寸