检索 HTML 元素的位置 (X,Y)

问:

我想知道如何在 JavaScript 中获取 img 和 div 等 HTML 元素的 X 和 Y 位置。

答1:

huntsbot.com精选全球7大洲远程工作机会,涵盖各领域,帮助想要远程工作的数字游民们能更精准、更高效的找到对方。

正确的做法是使用 element.getBoundingClientRect():

var rect = element.getBoundingClientRect();
console.log(rect.top, rect.right, rect.bottom, rect.left);

只要您可能关心它,Internet Explorer 就一直支持这一点,并且最终在 CSSOM Views 中实现了标准化。所有其他浏览器都采用它a long time ago。

一些浏览器还返回高度和宽度属性,尽管这是非标准的。如果您担心较旧的浏览器兼容性,请检查此答案的修订以获取优化的降级实施。

element.getBoundingClientRect() 返回的值是相对于视口的。如果您需要它相对于另一个元素,只需从另一个矩形中减去一个矩形:

var bodyRect = document.body.getBoundingClientRect(),
    elemRect = element.getBoundingClientRect(),
    offset   = elemRect.top - bodyRect.top;

alert('Element is ' + offset + ' vertical pixels from ');

一个very interesting article on JS coordinates。 SO上没有提到这篇文章,它应该..

BoundingClientRect 在滚动时发生变化

答2:

huntsbot.com全球7大洲远程工作机会,探索不一样的工作方式

此函数返回元素相对于整个文档(页面)的位置:

function getOffset(el) {
  const rect = el.getBoundingClientRect();
  return {
    left: rect.left + window.scrollX,
    top: rect.top + window.scrollY
  };
}

使用它我们可以得到 X 位置:

getOffset(element).left

…或Y位置:

getOffset(element).top

谢谢亚当。拯救了我的一天

答3:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

库会竭尽全力获得元素的准确偏移量。这是一个简单的函数,可以在我尝试过的每种情况下完成这项工作。

function getOffset( el ) {
    var _x = 0;
    var _y = 0;
    while( el && !isNaN( el.offsetLeft ) && !isNaN( el.offsetTop ) ) {
        _x += el.offsetLeft - el.scrollLeft;
        _y += el.offsetTop - el.scrollTop;
        el = el.offsetParent;
    }
    return { top: _y, left: _x };
}
var x = getOffset( document.getElementById('yourElId') ).left; 

将:el = el.parentNode 更改为:el = el.offsetParent;现在它似乎适用于嵌套的 iframe……我想这就是你的意图?

对此进行了测试,即使存在缩放级别,它也能正常工作!

答4:

huntsbot.com洞察每一个产品背后的需求与收益,从而捕获灵感

如果您只想在 javascript 中完成,这里有一些使用 getBoundingClientRect() 的 one liner

window.scrollY + document.querySelector('#elementId').getBoundingClientRect().top // Y

window.scrollX + document.querySelector('#elementId').getBoundingClientRect().left // X

第一行将返回 offsetTop 说 Y 相对于文档。第二行将返回 offsetLeft 说 X 相对于文档。

getBoundingClientRect() 是一个 javascript 函数,它返回元素相对于窗口视口的位置。

答5:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

大多数浏览器上的 HTML 元素将具有:-

offsetLeft
offsetTop

这些指定元素相对于其最近的具有布局的父元素的位置。如果有 offsetParent 属性,通常可以访问此父级。

IE和FF3都有

clientLeft
clientTop

这些属性不太常见,它们使用其父客户区域指定元素位置(填充区域是客户区域的一部分,但边框和边距不是)。

答6:

保持自己快人一步,享受全网独家提供的一站式外包任务、远程工作、创意产品订阅服务–huntsbot.com

如果页面包含 - 至少 - 任何“DIV”,meouw 给出的函数会抛出超出当前页面限制的“Y”值。为了找到准确的位置,您需要同时处理 offsetParent 和 parentNode。

尝试下面给出的代码(检查 FF2):


var getAbsPosition = function(el){
    var el2 = el;
    var curtop = 0;
    var curleft = 0;
    if (document.getElementById || document.all) {
        do  {
            curleft += el.offsetLeft-el.scrollLeft;
            curtop += el.offsetTop-el.scrollTop;
            el = el.offsetParent;
            el2 = el2.parentNode;
            while (el2 != el) {
                curleft -= el2.scrollLeft;
                curtop -= el2.scrollTop;
                el2 = el2.parentNode;
            }
        } while (el.offsetParent);

    } else if (document.layers) {
        curtop += el.y;
        curleft += el.x;
    }
    return [curtop, curleft];
};


与其他解决方案一样,即使使用 FF 24.4,当边框宽度作为定位布局的一部分存在时,上述代码也不起作用。

你是一个救生员。我现在正在处理一些非常深的 GWT 错误,并将其放入 JSNI 方法中解决了我所有的问题!

答7:

huntsbot.com – 高效赚钱,自由工作

您可以向 Element.prototype 添加两个属性以获取任何元素的顶部/左侧。

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

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

这被称为:

var x = document.getElementById( 'myDiv' ).documentOffsetLeft;

这是一个将结果与 jQuery 的 offset().top 和 .left 进行比较的演示:http://jsfiddle.net/ThinkingStiff/3G7EZ/

修改 Element.prototype 通常被认为是一个坏主意。这导致代码很难维护。此外,此代码不考虑滚动。

答8:

huntsbot.com高效搞钱,一站式跟进超10+任务平台外包需求

有效地检索相对于页面的位置,而不使用递归函数:(也包括 IE)

var element = document.getElementById('elementId'); //replace elementId with your element's Id.
var rect = element.getBoundingClientRect();
var elementLeft,elementTop; //x and y
var scrollTop = document.documentElement.scrollTop?
                document.documentElement.scrollTop:document.body.scrollTop;
var scrollLeft = document.documentElement.scrollLeft?                   
                 document.documentElement.scrollLeft:document.body.scrollLeft;
elementTop = rect.top+scrollTop;
elementLeft = rect.left+scrollLeft;

包括所有重要的 scrollTop/scrollLeft 使这个答案更加正确。

答9:

huntsbot.com汇聚了国内外优秀的初创产品创意,可按收入、分类等筛选,希望这些产品与实践经验能给您带来灵感。

像这样的事情怎么样,通过传递元素的ID,它会返回left或top,我们也可以将它们组合起来:

  1. 找到左边
function findLeft(element) {
  var rec = document.getElementById(element).getBoundingClientRect();
  return rec.left + window.scrollX;
} //call it like findLeft('#header');

2)找到顶部

function findTop(element) {
  var rec = document.getElementById(element).getBoundingClientRect();
  return rec.top + window.scrollY;
} //call it like findTop('#header');

或 3) 一起找到 left 和 top

function findTopLeft(element) {
  var rec = document.getElementById(element).getBoundingClientRect();
  return {top: rec.top + window.scrollY, left: rec.left + window.scrollX};
} //call it like findTopLeft('#header');

答10:

huntsbot.com – 高效赚钱,自由工作

jQuery .offset() 将获取第一个元素的当前坐标,或者设置匹配元素集中每个元素相对于文档的坐标。

由于某种原因,与其他浏览器相比,它在 IE 中给出的结果不同。我认为在 IE 中它给出了相对于窗口的位置,所以如果你滚动,与其他人相比,你会在 IE 中得到不同的结果

offset() 被缩放混淆了,至少在 Android Chrome 中是这样,所以它没用。 stackoverflow.com/a/11396681/1691517 表示缩放容错方式。

答11:

huntsbot.com聚合了超过10+全球外包任务平台的外包需求,寻找外包任务与机会变的简单与高效。

这是一个使用 vanilla JS 递归迭代 element.offsetTop 和 element.offsetParent 的现代 1-liner:

功能:

getTop = el => el.offsetTop + (el.offsetParent && getTop(el.offsetParent))

用法:

const el = document.querySelector('#div_id');
const elTop = getTop(el)

优势:

无论当前滚动位置如何,始终返回绝对垂直偏移量。

传统语法:

function getTop(el) {
  return el.offsetTop + (el.offsetParent && getTop(el.offsetParent));
}

谢谢,找到 offsetParent 的 offsetTop 帮助我找到了正确的位置。

原文链接:https://www.huntsbot.com/qa/w7vy/retrieve-the-position-x-y-of-an-html-element?lang=zh_CN&from=csdn

huntsbot.com – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值