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

2024-03-29

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

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

然后通过点击轨道使用滚动条进行滚动,或者使用PageDown/PageUp进行滚动,然后我们可以看到在滚动动画结束时我们只收到了一个事件。

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

$(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,中间没有值。

如果那么去console.log(document.documentElement.scrollTop)每10ms,那么我们可以看到IE只是不更新scrollTop当它滚动时。

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

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

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

谢谢 :-)


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

这不会将其关闭,但这是我用来解决 ie 中固定元素的平滑滚动问题的方法。

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);
    });
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

IE 11 平滑滚动不触发中间滚动事件 的相关文章

随机推荐