问:
我想知道如何在 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,我们也可以将它们组合起来:
- 找到左边
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 – 程序员副业首选,一站式外包任务、远程工作、创意产品分享订阅平台。