【发布时间】:2010-12-18 16:21:26
【问题描述】:
我见过很多可以捕捉页面内元素/对象的 x 和 y 位置的脚本。但是当网页在正文或其他元素、绝对/相对元素等使用边距时,我总是无法捕捉 x 和 y。
无论使用什么边距或填充,是否有提供准确位置的解决方案?
【问题讨论】:
标签: javascript position margin absolute
我见过很多可以捕捉页面内元素/对象的 x 和 y 位置的脚本。但是当网页在正文或其他元素、绝对/相对元素等使用边距时,我总是无法捕捉 x 和 y。
无论使用什么边距或填充,是否有提供准确位置的解决方案?
【问题讨论】:
标签: javascript position margin absolute
我使用以下代码将 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.offsetLeft 和document.body.offsetTop 怎么样?
offsetLeft 和offsetTop,为什么还要向上遍历DOM 树两次?
获取确切位置只需将 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 快两倍,因为我们只循环一次。
【讨论】:
你的代码非常糟糕,我对 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 并且rel 是undefined 时它应该停止好吧,所以非严格相等是有目的的,不要改变它。它还返回一个对象,因为它在使用上比数组更具可读性(因此您可以执行getPos().x 之类的操作)。
这是来自 Pacerier 的解决方案,所以如果您要对此表示赞同,请考虑也支持他的解决方案。
【讨论】:
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>
别担心...无论元素有多少边距、位置或填充,它总是有效的
【讨论】: