IE 10和11在使用鼠标滚轮滚动时会导致固定背景跳动

55

当你在Windows 8中使用鼠标滚轮滚动时,固定的背景图像会飞快地弹跳。这仅影响IE 10和IE 11。这也会影响具有 position:fixed 属性的元素。

以下是一个具有固定背景图像的示例:

http://www.catcubed.com/test/bg-img-fixed.html

以下是示例代码:

#section{
    position: fixed;
    top:0;
    left:0;
    background-color:#eee;
    background-position: top left;
    background-image: url("images/7.png");
    background-size: auto; 
    background-repeat: no-repeat;
    z-index: 10;
}

在IE 10和11中有没有保持背景静止的解决方案?


3
发现这个链接:http://connect.microsoft.com/IE/feedback/details/795070/mouse-wheel-issue-with-position-fixed-images。 - ropo
2
固定元素内部的固定元素会导致跳动问题。将父元素的位置更改为绝对定位,例如。绝对定位通常不需要任何其他更改,或根据您的需求进行更改。 - Dušan
对我来说,跳跃的行为是由HTML元素上的opacity:0.99引起的(这是解决Mac上更粗字体的方法)。 - nebulousGirl
1
很遗憾,这个问题已经关闭了。在调查期间,我发现了这个基于Javascript的解决方法: 如果(navigator.userAgent.match(/Trident/7./)) { // 如果是IE $('body').on("mousewheel", function () { // 移除默认行为 event.preventDefault(); // 无平滑滚动 var wheelDelta = event.wheelDelta; var currentScrollPosition = window.pageYOffset; window.scrollTo(0, currentScrollPosition - wheelDelta); });} - Windwalker
我刚遇到一个情况,通过从重叠固定背景的元素中移除 box-shadow,我能够减少卡顿。 - Rudey
为什么这个问题被关闭了?它显然是关于代码问题的,而且似乎没有解决。对我来说唯一有用的方法是将固定元素包装并设置到包装器中: #fixwrapper{ -webkit-transform: translate3d(0, 0, 0); transform : translate3d(0, 0, 0); position: fixed; top: 0; height: 100%; } - MarkWalczak
6个回答

49

我知道回答有点晚,但我曾经遇到过同样的问题,通过在我的CSS文件中添加这些属性,我成功解决了它。

html{
    overflow: hidden;
    height: 100%;    
}
body{
    overflow: auto;
    height: 100%;
}

评论中的内容:

这个解决方法会阻止窗口上的滚动事件触发,所以如果您使用依赖于这些事件触发的东西,请小心。 codepen.io/anon/pen/VawZEV?editors=1111(overflow: hidden,滚动事件不起作用)codepen.io/anon/pen/PNoYXY?editors=1111(overflow: auto,滚动事件会触发)- Dan Abrey

所以这可能会在您的项目中引起一些问题。但我没有看到另一种解决IE中此错误的方法。


8
这个解决方案可以停止窗口的滚动事件触发,所以如果您使用了依赖于此类事件触发的任何内容,请小心。请参考以下链接:http://codepen.io/anon/pen/VawZEV?editors=1111 (当<html>设置为overflow:hidden时,滚动事件无效)和http://codepen.io/anon/pen/PNoYXY?editors=1111 (当<html>设置为overflow:auto时,滚动事件会触发)。 - Dan Abrey
这个解决方案对于移动浏览器来说并不理想,因为它重新定义了默认的滚动容器,导致滚动变慢和其他问题(例如,在滚动时查询面板不会隐藏)。 - Cubius
我最终只在桌面版IE浏览器中添加了这个功能,以便其他浏览器中的滚动容器可以正常工作。对我来说,一些功能在IE中可能无法正常工作是可以接受的。...我真的不明白像微软这样的公司为什么不能消除这个已经存在两年的错误... - Lars
这是我找到的唯一可行的解决方案,但我遇到了一个奇怪的 bug,当我的鼠标悬停在顶部的固定导航栏上时,我无法向下滚动页面。删除 html { overflow: hidden } 可以防止出现此问题,但也会破坏视差修复。我猜这可能就是 @DanAbrey 所指的问题。有没有什么办法可以让这个解决方案在不停止这些滚动事件的情况下工作? - jhawes

25

这似乎是一个z-index的bug,尝试添加z-index: 1。

在研究此问题时,我发现最好的调试方法是:

在页面顶部创建一个简单的元素,例如:

 <style>#test {position: fixed; background: red; top: 0; left: 0; width: 4em}</style>
 <div id="test">Test</div>
在上述所有情况下,它都可以正确工作,并且滚动是平滑的。这证明了它是可行的!现在逐渐添加您的属性,直到能够使元素以固定位置正常工作于您的站点环境中。
我发现将 z-index 添加到固定项目中可以解决此问题。 (例如:z-index:1)
我还发现,一旦在子元素上设置了位置,该 bug 就会从那个点开始向下呈现。
所以您需要确保没有任何子元素设置了位置,或者如果有的话,则显式地在每个子元素上设置位置。
例如:
<!-- Works -->
<div style="position: fixed;">
    <div>Nice</div>
    <div>Wicked</div>
    <div>Cool</div>
</div>

<!-- Element with position: relative, experiences the bug -->
<div style="position: fixed;">
    <div style="position: relative;">sad</div>
    <div>sad</div>
    <div style="position: fixed;">happy</div>
</div>

可以修复,但需要一些调整!


2
我曾经遇到过一个类似的问题,那就是在屏幕顶部有一个固定的Bootstrap导航栏。如果页面上还包含一些固定或绝对定位的文本,那么在滚动时导航栏会晃动。只需将z-index = 1添加到固定/绝对定位的文本中即可解决这个问题。 - Jules
2
我已经尝试了上述所有方法,但仍然无法使其正常工作。它仍然只能在鼠标滚动时跳转 :( - YodasMyDad
此外,确保您没有将position:fixed元素作为position:fixed元素的子元素,而应将其定位为绝对定位。这样它仍然会像父元素一样固定。 - Nickfmc
你明确地为每个子元素设置了位置,这对我很有效。 - V Maharajh
z-index对我有用,谢谢!(IE11,Windows 10) - Ionut Ciuta

8

以下是解决方法(Windows 8.1测试通过):

将"background" CSS属性移到BODY元素上。目前它在id为“filler”的DIV元素上。以下是修改后的CSS代码:

    body {
        font-family: Helvetica, Arial, sans-serif;
        background: #fff url(blue-kitty.jpg) no-repeat fixed center 100px;
    }

    #filler {
        text-align: center;
    }

    .big-margin {
        margin-top: 500px;
    }

哇...真不敢相信人们会忽略这个...这实际上是唯一半可行的解决方法,直到微软修复IE的平滑滚动。是的,它将适用于单个背景图像,但这是我们目前拥有的全部,并且可以在两分钟内完成。 - user1641831
1
如果页面上有多个固定项,则此方法将无法正常工作。 - YodasMyDad
这对我有用。尝试了此答案中的所有解决方案,最终将背景图像移动到body标签上起作用了。我的页面上有两个固定项,即背景图像和返回顶部按钮。 - Elitmiar

4

试着关闭平滑滚动选项。

互联网选项 - 高级选项卡 - 使用平滑滚动

这就像呈现错误一样... 微软IE团队正在调查中...


11
这只适用于你自己,平滑滚动默认已启用,你的用户可能会遇到这个问题。 - Etienne Dupuis

3

只需将文本主体容器定义为相对位置。

<style>
    body
    {
        position: relative;
    }
</style>

2
在我的情况下,解决方法是从具有position:fixed属性的元素中删除z-index属性,然后IE就停止了奇怪的闪烁。(在IE选项中禁用平滑滚动可以使z-index属性生效,但这并不是一种解决方法,因为用户通常会默认启用它)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接