滚动子 div 滚动窗口,我该如何停止?

IT技术 javascript html
2021-03-17 12:12:48

我有一个带有滚动条的 div,当它到达末尾时,我的页面开始滚动。无论如何我可以阻止这种行为吗?

6个回答

您可以通过执行以下操作来停用整个页面的滚动:

<div onmouseover="document.body.style.overflow='hidden';" onmouseout="document.body.style.overflow='auto';"></div>
许多浏览器滚轮随着用户现在移动鼠标而消失和重新出现,因此上述评论不再是问题。
2021-05-10 12:12:48
不是解决方案。将溢出设置为隐藏会隐藏滚动条,滚动条会突然重新格式化外部元素的所有内容。此外,这假设外部元素是 body,但它可能是另一个滚动 div。
2021-05-12 12:12:48
@cstack 你是对的,这就是为什么 OP (Jeevan) 自己的答案更好。
2021-05-13 12:12:48
但是,当页面嵌入到 iframe 中时,此解决方案不起作用。
2021-05-16 12:12:48
很好,但是只要您将鼠标悬停在 div 上,它就会使浏览器的滚动条消失。
2021-05-19 12:12:48

找到了解决办法。

http://jsbin.com/itajok

这就是我所需要的。

这是代码。

http://jsbin.com/itajok/edit#javascript,html

使用 jQuery 插件。


由于弃用通知而更新

jquery-mousewheel

向事件处理程序添加三个参数(deltadeltaX、 和deltaY的旧行为现在已弃用,并将在以后的版本中删除。

那么,event.deltaY现在必须使用:

var toolbox = $('#toolbox'),
    height = toolbox.height(),
    scrollHeight = toolbox.get(0).scrollHeight;

toolbox.off("mousewheel").on("mousewheel", function (event) {
  var blockScrolling = this.scrollTop === scrollHeight - height && event.deltaY < 0 || this.scrollTop === 0 && event.deltaY > 0;
  return !blockScrolling;
});

演示

您的“解决方案”仅适用于鼠标滚动事件,不适用于向上/向下翻页或箭头键。
2021-04-25 12:12:48
您的链接将 github 用于 js 并中断,因为内容类型 blah blah 在这里这个有效:jsbin.com/itajok/207
2021-04-29 12:12:48
这两个 jsbin 似乎都不能在 Chrome 设备模拟器和 iPhone 上工作。有谁知道这是否仍然有效?
2021-05-13 12:12:48
为什么这里需要“关闭”?
2021-05-19 12:12:48

所选的解决方案是一件艺术品。认为它值得一个插件......

$.fn.scrollGuard = function() {
    return this
        .on( 'wheel', function ( e ) {
            var event = e.originalEvent;
            var d = event.wheelDelta || -event.detail;
            this.scrollTop += ( d < 0 ? 1 : -1 ) * 30;
            e.preventDefault();
        });
};    

这给我带来了持续的不便,与我见过的其他黑客相比,这个解决方案非常干净。很想知道它是如何工作的以及它会得到多广泛的支持,但是为 Jeevan 和最初提出这个的人欢呼。顺便说一句 - stackoverflow 答案编辑器需要这个!

更新

我相信这更好,因为它根本不尝试操作 DOM,只是有条件地防止冒泡......

$.fn.scrollGuard2 = function() {
  return this
    .on( 'wheel', function ( e ) {
      var $this = $(this);
      if (e.originalEvent.deltaY < 0) {
        /* scrolling up */
        return ($this.scrollTop() > 0);
      } else {
        /* scrolling down */
        return ($this.scrollTop() + $this.innerHeight() < $this[0].scrollHeight);
      }
    })
  ;
};    

在 chrome 中效果很好,比其他解决方案简单得多……让我知道它在其他地方的表现……

小提琴

实际上看起来两者都已弃用...wheel事件
2021-04-29 12:12:48
添加 DOMMouseScroll 事件使其适用于 Firefox → jsfiddle.net/chodorowicz/egqy7mbz/1
2021-05-03 12:12:48
我很惊讶这没有写入 jquery。我认为要点之一是不必关心您使用的是什么浏览器。
2021-05-10 12:12:48
这会导致 Macbook 上 Chrome 的滚动速度明显加快。接受的解决方案没有这个问题。
2021-05-11 12:12:48
令人失望。这有很多不同的版本。似乎是 ui 的一个重要方面,当它如此不直观时,这是默认行为,确实令人惊讶。显然,浏览器知道内部滚动 div 处于其极限,以便能够将事件应用于窗口,那么为什么没有可用的句柄来查询它呢?
2021-05-16 12:12:48

您可以在 div 上使用 mouseover 事件禁用主体滚动条,然后使用 mouseout 事件再次激活它?

例如 HTML

<div onmouseover="disableBodyScroll();" onmouseout="enableBodyScroll();">
    content
</div>

然后像这样的javascript:

var body = document.getElementsByTagName('body')[0];
function disableBodyScroll() {
    body.style.overflowY = 'hidden';
}
function enableBodyScroll() {
    body.style.overflowY = 'auto';
}
你也可以用document.body
2021-05-18 12:12:48

正如这里所回答的,大多数现代浏览器现在都支持overscroll-behavior: none;CSS 属性,以防止滚动链接。就是这样,只有一行!

某些边缘版本不完全支持这一点。知道如何以不同的方式解决这个问题吗?
2021-04-25 12:12:48
这应该是 2020 年的正确答案。对于我的用例,最佳解决方案是overscroll-behavior: contain;.
2021-05-03 12:12:48