我正在构建一个绑定到 $(window).scroll() 事件的自动关注 div。这是我的 JavaScript。
var alert_top = 0;
var alert_margin_top = 0;
$(function() {
alert_top = $("#ActionBox").offset().top;
alert_margin_top = parseInt($("#ActionBox").css("margin-top"));
$(window).scroll(function () {
var scroll_top = $(window).scrollTop();
if(scroll_top > alert_top) {
$("#ActionBox").css("margin-top", ((scroll_top-alert_top)+(alert_margin_top*2))+"px");
console.log("Setting margin-top to "+$("#ActionBox").css("margin-top"));
} else {
$("#ActionBox").css("margin-top", alert_margin_top+"px");
};
});
});
此代码假定存在此 CSS 规则
#ActionBox {
margin-top: 15px;
}
它需要一个 id 为“ActionBox”的元素(在本例中为 div)。该 div 位于一个左对齐的菜单中,该菜单向下运行,因此它的起始偏移量约为 200 px)。目标是在用户滚动到 div 可能开始从浏览器视口顶部消失的点后开始添加到 margin-top 值(是的,我知道将其设置为 position: fixed 会做同样的事情,但它会掩盖 ActionBox 下方但仍在菜单中的内容)。
现在,console.log 显示事件每次都在触发,并且它设置了正确的值。但是在我的网络应用程序的某些页面中,没有重绘 div。这特别奇怪,因为在其他页面(在 IE 中)代码按预期工作(并且每次都在 FF、Opera 和 WebKit 中工作)。所有页面都进行评估(根据 W3C 验证器和 FireFox HTMLTidy 验证器,0 个错误和 0 个警告),并且没有抛出 JS 错误(根据 IE Developer Toolbar 和 Firebug)。这个谜的另一部分是,如果我在 IE 开发人员工具的 HTML 样式资源管理器中取消选择 #ActionBox margin-top 规则,那么 div 会立即跳回到新调整的位置,如果滚动事件触发了重绘,它应该有. 此外,如果我强制 IE8 进入 Quirks 模式或兼容模式,那么它甚至会触发更新。
还有一件事,它在 IE7 和 IE 6 中按预期工作(感谢出色的 IETester)