Firefox和Chrome为offsetTop提供不同的值

wax*_*ing 9 html javascript css

我试图相对于输入字段定位一个span元素(让我们称之为"工具提示跨度").为此,我将工具提示范围和输入字段包装在另一个span元素中(让我们称之为"包装器跨度")position: relative.然后我设置position: absolute工具提示跨度.这使得工具提示跨度位置本身相对于包装器跨度,但不是页面流的一部分 - 不占用任何空间.这正是我想要的.

然后,使用javascript,我设置工具提示相对于输入元素位置的位置.由于输入元件可以不同在不同的页面被成形(脚本应globablly适用),我使用其offsetTopoffsetLeft属性,以计算相对于所述包装跨度其位置.

但是,我注意到这里的浏览器之间存在不一致.在Firefox,IE6,7,8中,它按预期工作.但在Chrome和Safari中,报道offsetTop似乎是错误的.

为了证明这一点,我在下面创建了测试页面:

<html>
<head>
<style type="text/css">
span { font-size: 8px; position: relative; top: 0; left: 0; border: 1px solid red } 
</style>
</head>
<body>

<span id="wrapper">
<input id="foo" name="foo" type="text">
</span>

<script type="text/javascript">
document.write("<br>Offset parent: " + document.getElementById("foo").offsetParent.id);
document.write("<br>Offset top: " + document.getElementById("foo").offsetTop);
</script>

</body>
</html>
Run Code Online (Sandbox Code Playgroud)

并将其加载到Firefox和Chrome中.两个浏览器都报告包装器范围offsetParent,但对于Firefox,它offsetTop是-8,对于Chrome,它是2.视觉上,两个浏览器中的页面呈现相同.

这让我很头疼,因为当我有人使用Chrome时,我不能只使用不同的偏移,因为如果我改变字体大小,offsetTop则不会改变,我的脚本会破坏.

这是一个错误吗?我能解决这个问题吗?

小智 15

你可以尝试使用

$(window).load 
Run Code Online (Sandbox Code Playgroud)

代替

$(document).ready
Run Code Online (Sandbox Code Playgroud)

因为Explorer和Chrome仅在图像完全加载后才设置正确的偏移量.


Mik*_*ord 2

使用 jQuery。浏览器之间的 DOM 差异是它擅长的事情之一。

  • 神圣的生锈金属!我想说的是,这不是 JQuery 可以解决的问题之一。但事实证明,有一个我不知道的position()函数,它确实起到了作用。问题仍然在于为什么 Chrome/Safari 会以不同的方式报告偏移量。但你收到了支票。 (3认同)