【问题标题】:jQuery .css("margin-top", value) not updating in IE 8 (Standards mode)jQuery .css("margin-top", value) 未在 IE 8 中更新(标准模式)
【发布时间】:2010-02-23 21:30:33
【问题描述】:

我正在构建一个绑定到 $(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)

【问题讨论】:

标签: javascript jquery internet-explorer-8 ie-developer-tools


【解决方案1】:

您在 Firefox 中的脚本有问题。当我向下滚动时,脚本继续为页面添加边距,我永远不会到达页面底部。这是因为 ActionBox 仍然是页面元素的一部分。我发了demo here

  • 一种解决方案是在 CSS 定义中添加 position: fixed,但我认为这对您不起作用
  • 另一种解决方案是将 ActionBox 绝对定位(到文档正文)并调整 top
  • 更新了代码以适应为他人受益的解决方案。

更新:

CSS

#ActionBox {
 position: relative;
 float: right;
}

脚本

var alert_top = 0;
var alert_margin_top = 0;

$(function() {
  alert_top = $("#ActionBox").offset().top;
  alert_margin_top = parseInt($("#ActionBox").css("margin-top"),10);

  $(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");
    };
  });
});

另外,在parseInt() 中添加一个基数(在本例中为 10)也很重要,例如

parseInt($("#ActionBox").css("top"),10);

【讨论】:

  • 我已经更新了您演示中的代码(在 FF 中显示了一个问题),以更好地匹配我使用这个 div 的方式。这是链接pastebin.me/6e3cf10ff24f4e1cf20d79384a8d4f64
  • 这很奇怪,页面第一次加载时它似乎在 IE 中工作。但是如果我查看代码并返回查看输出屏幕,它就会停止工作。我尝试在 jsbin 上测试代码并得到了类似的结果......当它不在垃圾箱中时,它似乎对我来说工作得很好,或者我不明白你想要完成什么。
  • 如果您更新答案以显示组合的 CSS 修复和 margin-top javascript,那么我会选择它作为正确答案。
  • 完成...它只是显示了我们都必须做多少额外的工作才能让 IE 工作:( 无论如何,我很高兴你得到你的答案!
【解决方案2】:

尝试用marginTop 代替margin-top,例如:

$("#ActionBox").css("marginTop", foo);

【讨论】:

  • 驼峰式 CSS 属性仍然有效,但不会触发我正在寻找的重绘。
【解决方案3】:

我找到了答案!

我想感谢大家为寻找更好的方法来解决这个问题所做的辛勤工作,不幸的是,由于一系列更大的限制,我无法选择它们作为“答案”(我投票是因为你应该贡献积分)。

我面临的具体问题是 JavaScript onScoll 事件正在触发,但随后的 CSS 更新并未导致 IE8(在标准模式下)重绘。更奇怪的是,在某些页面中它正在重绘,而在其他页面中(没有明显的相似性)却不是。最终的解决方案是添加以下CSS

#ActionBox {
  position: relative;
  float: right;
}

这是一个更新的pastbin 显示了这一点(我添加了一些更多的样式来显示我是如何实现这段代码的)。 fudgey 谈到的 IE“编辑代码”然后“查看输出”错误仍然存​​在(但这似乎是 Pastbin(和类似服务)独有的事件绑定问题

我不知道为什么添加“float: right”可以让 IE8 完成对已经触发的事件的重绘,但出于某种原因它确实如此。

【讨论】:

    【解决方案4】:

    IE8的正确格式是:

      $("#ActionBox").css({ 'margin-top': '10px' });  
    

    有了这项工作。

    【讨论】:

      【解决方案5】:

      试试这个方法

      $("your id or class name").css({ 'margin-top': '18px' });  
      

      【讨论】:

        猜你喜欢
        • 2015-11-04
        • 1970-01-01
        • 2010-09-22
        • 1970-01-01
        • 2013-09-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多