javascript - `window.ScrollTo(...)` 事件中的 `mousemove` 会产生可怕的卡顿滚动

标签 javascript html css scroll scrollbar

我有一个自定义滚动条解决方案 ( view on CodePen )。

显而易见的想法是拖动自定义滚动条应该滚动页面。

试一试,看看会发生什么......奇怪的是卡顿,滚动条和页面滚动会突然在点之间卡住。

滚动过程当前在 mousemove 处理程序中:

  • 直观地更新滚动条位置
  • window.scrollTo(...) 新位置,计算为相对于新滚动条位置的视口(viewport) top

如果我注释掉 window.scrollTo(...) 行,滚动条本身会完美平滑地移动并与光标保持一致。

相关代码

    mousemove(e) {
        if (!this.active) return;
        this.update(this.getScrollDeltaPositional(e.pageY));
        window.scrollTo({top: this.getWindowScrollTop()});
    }

    update(position, show=true, timer=true, time=0) {
        let track = this.getTrackHeight();
        this.trackPosition = Math.min(Math.max(position, 0), track);
        this.track.style.transform = `translateY(${this.trackPosition}px)`;
    }

    getWindowScrollTop() {
        let scroll = this.getDocumentScroll();
        let position = (this.trackPosition / this.root.clientHeight);
        return Math.round(scroll * position);
    }

(建议您在 CodePen 上查看完整源代码)

我假设滚动每个 mousemove 会阻止 mousemove 事件,导致观察到突然的快照。

如何使用自定义滚动条在window上实现流畅的滚动效果?

最佳答案

我终于找到了答案

在尝试了所有可能的补救措施后,我偶然发现了这个相同的问题:https://css-tricks.com/forums/topic/scrolltop-inexplicably-going-haywire/ .

正如该用户最终发现的那样,MouseEvent.pageY(这是我用来获取滚动位置的)是

relative to the top edge of the viewport, including scroll offsets.

因此,滚动移动有效地放大了 mousemove 事件,导致滚动以指数方式加速,如演示中所示。

因此,经过半天的研究,解决方法是简单的 Ctrl+H...改为使用 MouseEvent.clientY

关于javascript - `window.ScrollTo(...)` 事件中的 `mousemove` 会产生可怕的卡顿滚动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55500322/

相关文章:

javascript - 如何从多个不同长度的数组创建一个设定长度的新数组,根据重要性从每个较小的数组中取出的项目数

javascript - Internet Explorer 和 tspan 垂直对齐

html - 将一个 div 置于另一个 div 的中心

javascript - 如何使用 PHP 值和输入值作为输入进行动态 JavaScript 调用

html - WordPress 3 Visual Editor - 如何添加空格?

CSS3 旋转动画在 Chrome 中不起作用

javascript - Knockoutjs css 绑定(bind)不起作用

javascript - 将数据从 ajax GET 发送到 ejs 文件

javascript - 如何在剑道中的单击事件中获取包含复选框的行

javascript - jQuery 不适用于叠加层?