首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >IE 11平滑滚动,不触发中间滚动事件

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

Stack Overflow用户
提问于 2014-02-14 17:17:56
回答 3查看 16K关注 0票数 22

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

代码语言:javascript
复制
document.documentElement.addEventListener('scroll', function() {
    console.log(document.documentElement.scrollTop);
});

然后使用滚动条单击轨迹或使用PageDown/PageUp滚动,然后我们可以看到在滚动动画的末尾只有一个事件。

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

代码语言:javascript
复制
$(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的滚动事件,没有介于两者之间的值。

如果然后每10ms执行一次go和console.log(document.documentElement.scrollTop),那么我们可以看到IE在滚动时并不更新scrollTop

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

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

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

谢谢:-)

EN

回答 3

Stack Overflow用户

发布于 2014-11-18 15:39:34

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

我将继续研究这个问题;实际上,我只是从柜子里挖出一台Windows7机器来进行设置,以便在早上进行进一步的研究。虽然我们不能正面解决这个问题,但也许,也许有一种方法可以绕过问题本身。

未完待续。

票数 6
EN

Stack Overflow用户

发布于 2014-12-02 08:41:53

作为疯狂的最后一招(如果问题很严重,看起来并不是那么疯狂)-也许完全关闭本地滚动,而使用自定义滚动(即http://jscrollpane.kelvinluck.com/)?并将onscroll内容绑定到它的自定义事件:http://jscrollpane.kelvinluck.com/events.html

票数 1
EN

Stack Overflow用户

发布于 2014-09-03 12:49:36

看起来在IE上有一篇文章,强迫屏幕上的“画图”来帮助拖放。看起来与大多数性能努力相反,但可能行得通?https://stackoverflow.com/a/12395506/906526 (来自https://stackoverflow.com/users/315083/george的代码)

代码语言:javascript
复制
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动画上应用一个显示/隐藏类。

代码语言:javascript
复制
.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性能可能会提供线索。作为一个加号,我已经看到几个网站的导航栏在滚动结束后“重新出现”。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21775234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档