【问题标题】:IE 11 smooth scrolling not firing intermediate scroll eventsIE 11 平滑滚动不触发中间滚动事件
【发布时间】:2019-03-06 21:12:57
【问题描述】:

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

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

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

现在理论上我可以通过模拟滚动事件来修复一些这种行为。带有 jQ​​uery 和下划线的示例代码:

$(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 中的平滑滚动?)那么我非常想听听!

谢谢:-)

【问题讨论】:

  • 没什么啊?是这样想的。
  • 这是旧的,但我遇到了完全相同的问题。我尝试使用 setInterval 并强制该函数以 60fps 的速度更新,但这只是让它在所有浏览器上都明显抖动。另外,它似乎对 IE 没有影响:\
  • 经过一番折腾,我发现最好的解决方法是尽可能使用position:fixed,而不是手动使用position:absolutetop。这绝对是 IE 中的渲染错误。在禁用平滑滚动的情况下,它并没有表现得那么多,但它仍然有些生涩。另外,平滑滚动默认是开启的,所以几乎所有的 IE 用户都会注意到这个问题。
  • 我的问题不在于固定元素,而在于虚拟表......滚动时您无法呈现新单元格。 IE,像往常一样,糟透了。即使在 10 个版本之后。
  • “我没有在任何其他浏览器上观察到这种行为” - iOS Safari 从它首次发布之日起就一直如此。我怀疑 IE 团队认为,如果这能给他们带来性能优势,他们可以效仿这个先例。 Android Chrome 相当频繁地发送滚动事件,但不足以消除抖动。

标签: javascript jquery internet-explorer underscore.js


【解决方案1】:

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

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

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);
    });
}

【讨论】:

  • 看起来不错 - 阻止 IE 11 继续滚动...您是否尝试创建一个解决方案来修复页面向上/向下?
  • 如果我们可以添加对基于触摸(滑动)滚动、键盘向上/向下和触控板的支持,那就太棒了。我遇到的错误是使用背景附件:已修复。
【解决方案2】:

您所描述的问题仅限于在 Windows 7 上运行的 Internet Explorer 11 实例。此问题不会影响 IE 11 诞生的平台 Windows 8.1。似乎 Windows 7 上的 IE 11 与上述其他滚动实现属于类似类别。这并不理想,但这是我们暂时必须解决的问题。

我将继续研究这个;事实上,早上第一件事就是从壁橱里挖出一台 Windows 7 机器进行设置,以便进一步调查。虽然我们无法正面解决这个问题,但也许,也许,有一种方法可以绕过这个问题本身。

待续。

【讨论】:

  • 听起来……你是IE团队的?还是我弄错了?无论如何 - 任何努力都值得赞赏!而且我确定不只是我......因为这是对可能功能的一个很大限制。 (虚拟表等)
  • @daniel.gindi 是的,我是 Internet Explorer 团队的项目经理。如果您有一个因此而中断的演示,我会很感激一个链接。尝试一些东西会使进一步的调查更有成效。
  • @Jonathan Sampson 据我了解,问题在于 IE11 在平滑滚动动画期间未触发滚动事件。所以我们看到页面滚动动画,但在这个动画期间我们没有得到滚动事件,所以所有需要在滚动事件上更新的东西实际上并没有更新,它只在动画结束时立即更新,当滚动事件被触发时。当页面已经动画化并且需要更新的内容在动画后跳转到适当位置时,这给了我们一种生涩的行为。
  • @Jonathan Sampson 在 Win 8 和 IE 10.0.9200.16384 上我看到这个小提琴在动画期间没有更新 div 文本。请参阅:goo.gl/tYYilU 在 Win 8.1 和 IE 11.0.13 上,此小提琴在动画期间更新 div 文本,但在现实世界的示例中,滚动动画期间仍有跳跃,请参阅:goo.gl/7qfPkc,这意味着可能在动画滚动事件期间发送速率不足之类的,但在win8.1上的IE11中显然存在一些问题。相比 Firefox 的平滑滚动,元素固定平滑,就像我们用手拖动滚动条一样:goo.gl/h07Ty8
  • @Jonathan Sampson,更清楚的例子:jsbin.com/bulivizozi/1。在这里,我们还更新了元素的顶部位置。在 Win 8.1 和 IE 11.0.13 上,滚动动画时元素抖动,尽管滚动事件正在触发。如果我们手动拖动滚动条,元素不会抖动:goo.gl/wliFqV。但是我正在使用来自modern.IE VM的win 8.1,并且有一段时间没有更新它。也许这不是最新 Windows 版本的问题...
【解决方案3】:

作为一个疯狂的最后手段(如果问题很严重,实际上似乎并不那么疯狂)-也许完全关闭本机滚动并使用自定义滚动(即http://jscrollpane.kelvinluck.com/)?并将 onscroll 内容绑定到其自定义事件:http://jscrollpane.kelvinluck.com/events.html

【讨论】:

  • 是的,这可能是一个解决方案(或破解),我将不得不进行一些测试以了解它如何处理触摸事件...
【解决方案4】:

看起来在 IE 上有一个帖子并强制屏幕“绘制”以帮助拖放。似乎与大多数性能努力相反,但可能有效? 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 动画上应用显示/隐藏类。

.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 性能可能会提供线索。另外,我看到几个网站的导航栏在滚动结束后“重新出现”。

【讨论】:

  • 这有什么帮助?重绘与滚动无关。如果这可行,您是否建议让浏览器每 X 毫秒重绘一次,无论它是否正在滚动?
  • 我理解这个问题是因为“移动菜单”看起来很生涩,所以建议重新绘制定位信息。滚轮滚动时,所有浏览器都会大幅移动。
  • 不,问题是没有获得 JAVASCRIPT ONSCROLL 事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-08
  • 1970-01-01
  • 1970-01-01
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多