【发布时间】:2013-06-24 01:48:23
【问题描述】:
我正在尝试相对于输入字段定位一个跨度元素(让我们称之为“工具提示跨度”)。为此,我将工具提示跨度和输入字段包装在另一个具有position: relative 的跨度元素(我们称之为“包装器跨度”)中。然后我在工具提示跨度上设置position: absolute。这使得工具提示跨度位置本身相对于包装器跨度但不是页面流的一部分 - 不占用任何空间。这正是我想要的。
然后,我使用 javascript 设置工具提示相对于输入元素位置的位置。由于输入元素在不同页面上的形状可能不同(脚本应该是全球适用的),我使用它的offsetTop 和offsetLeft 属性来计算它相对于包装器跨度的位置。
但是,我注意到这里的浏览器之间存在不一致。在 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>
并在 Firefox 和 Chrome 中加载它。两种浏览器都将包装器跨度报告为 offsetParent,但对于 Firefox,offsetTop 是 -8,对于 Chrome,它是 2。视觉上,页面在两种浏览器中呈现相同。
这让我很头疼,因为我不能只修改别人使用 Chrome 时总是应用的不同偏移量,因为如果我改变字体大小,offsetTop 不会改变,我的脚本会中断。
这是一个错误吗?我可以用不同的方式解决这个问题吗?
【问题讨论】:
-
尝试等待文档准备好
-
我在“真实”代码中做到了这一点:似乎无关紧要。我在 Firebug 和 Chrome 开发者窗口中检查了 offsetTop,值是一样的。
-
我已经移动了这样的标签标签(验证错误消息:d.pr/i/yvGS),方法是使它们成为内联块(连同 postion:absolute;),然后使用边距将它们相对于它的位置定位HTML,而不是 top/right/bottom/left 属性。可以锻炼,如果可以的话,你可以避免额外的 javascript。
标签: javascript html css