IE 11平滑滚动不会触发中间滚动事件

时间:2014-02-14 09:17:56

标签: javascript jquery internet-explorer underscore.js

如果我们做一个简单的测试用例如:

document.documentElement.addEventListener('scroll', function() {
    console.log(document.documentElement.scrollTop);
});

然后通过单击轨道或使用PageDown / PageUp使用滚动条滚动,然后我们可以看到在滚动动画结束时我们只获得一个事件。

现在理论上我可以通过模拟滚动事件来修复一些行为。使用jQuery和Underscore的示例代码:

$(function () {
    var $document = $(document), until = 0;

    var throttleScroll = _.throttle(function () {
        $document.scroll();
        if (+new Date < until) {
            setTimeout(throttleScroll, 50);
        }
    }, 50);

    $document.keydown(function (evt) {
        if (evt.which === 33 || evt.which === 34) {
            until = +new Date + 300;
            throttleScroll();
        }
    });
});

但它仍然无效。我们只会使用原始scrollTop和目标scrollTop获取滚动事件,其间没有值。

如果然后每10分钟转到console.log(document.documentElement.scrollTop),那么我们可以看到IE在滚动时不会更新scrollTop

如果我们想要将某些东西“固定”到滚动位置,这是非常令人沮丧的。 IE变得不稳定。

我没有在任何其他浏览器上观察到此行为,也没有使用以前的IE版本进行测试。

如果有人找到了修复IE行为的方法(也许有一个神奇的CSS来关闭IE 11中的平滑滚动?)那么我非常想听听它!

谢谢: - )

4 个答案:

答案 0 :(得分:8)

您说: &#34;如果有人找到了解决IE行为的方法(可能会有一个神奇的CSS来关闭在IE 11中顺利滚动?)然后我非常想听听它!&#34;

这不会将其关闭,但这是我用来解决平滑滚动问题,即使用固定元素。

if(navigator.userAgent.match(/Trident\/7\./)) {
    $('body').on("mousewheel", function ( event ) {
        event.preventDefault();
        var wd = event.wheelDelta;
        var csp = window.pageYOffset;
        window.scrollTo(0, csp - wd);
    });
}

答案 1 :(得分:6)

您所描述的问题仅限于在Windows 7上运行的Internet Explorer 11的实例。此问题不会影响IE 11诞生的平台,Windows 8.1。似乎Windows 7上的IE 11与上面提到的其他滚动实现属于类似的类别。它并不理想,但它是我们目前必须与之合作的东西。

我将继续研究这个问题;实际上,只是将一台Windows 7机器从机柜中取出来安装第一件事,以便进一步调查。虽然我们无法正面解决这个问题,但也许,我们可以通过这种方式来解决问题本身。

继续。

答案 2 :(得分:1)

作为一个疯狂的最后手段(如果问题很关键似乎并不那么疯狂) - 可能完全关闭原生滚动并使用自定义滚动(即http://jscrollpane.kelvinluck.com/)?并将onscroll内容绑定到其自定义事件:http://jscrollpane.kelvinluck.com/events.html

答案 3 :(得分:-1)

看起来在IE上发布了一个帖子并强制屏幕&#34; paint&#34;帮助拖放。似乎与大多数性能工作相反,但可能有效吗? https://stackoverflow.com/a/12395506/906526(代码来自https://stackoverflow.com/users/315083/george

function cleanDisplay() {
    var c = document.createElement('div');
    c.innerHTML = 'x';
    c.style.visibility = 'hidden';
    c.style.height = '1px';
    document.body.insertBefore(c, document.body.firstChild);
    window.setTimeout(function() {document.body.removeChild(c)}, 1);
}

您可以尝试CSS动画,以便浏览器处理动画/过渡。例如,在滚动和CSS动画上应用show / hide类。

.hide-remove {
    -webkit-animation: bounceIn 2.5s;
    animation: bounceIn 2.5s;
}

.hide-add {
    -webkit-animation: flipOutX 2.5s;
    animation: flipOutX 2.5s;
    display: block !important;
}

如果没有浏览器处理动画(使用广告素材css),关键帧和JS性能可能会提供潜在客户。作为一个加分,我已经看到几个带有导航栏的网站重新出现&#34;滚动结束后。