【问题标题】:Stop page from scrolling if hovering div [duplicate]如果悬停div,则停止页面滚动[重复]
【发布时间】:2013-05-01 18:06:50
【问题描述】:

我有一个可滚动的 div,但每当您到达它的底部/顶部时,它就会开始滚动整个页面。这对于快速滚动然后整个页面开始意外滚动的用户来说可能很烦人。

我需要一些东西,如果您将鼠标悬停在 div 上,则页面不可滚动。

当我将鼠标悬停在 div 上时,我已经通过添加 CSS 来尝试过...

body {
    overflow:hidden;
}

...它有效,但有一个问题。滚动条消失了,让它消失/重新出现看起来有点愚蠢。有什么方法可以达到相同的效果但保持滚动条可见?我已经看到它是通过 Facebook 聊天完成的。

【问题讨论】:

  • 它非常相似,但我讨厌涉及使用添加插件的解决方案,尤其是对于这种简单的事情。它可以做得更好。

标签: javascript jquery html css scroll


【解决方案1】:

这是一种非常简单的方法来停止传播,无需插件,只需 jQuery。

更新:代码已更新,可在 IE9+ 中正常工作。之前的版本没有测试过。

首先,在您的<div> 上创建一个类以将其标记为具有此行为。在我的示例中,我使用了 .Scrollable 类。

<div class="Scrollable">
  <!-- A bunch of HTML here which will create scrolling -->
</div>

要禁用的 jQuery 是:

$('.Scrollable').on('DOMMouseScroll mousewheel', function(ev) {
    var $this = $(this),
        scrollTop = this.scrollTop,
        scrollHeight = this.scrollHeight,
        height = $this.height(),
        delta = (ev.type == 'DOMMouseScroll' ?
            ev.originalEvent.detail * -40 :
            ev.originalEvent.wheelDelta),
        up = delta > 0;

    var prevent = function() {
        ev.stopPropagation();
        ev.preventDefault();
        ev.returnValue = false;
        return false;
    }

    if (!up && -delta > scrollHeight - height - scrollTop) {
        // Scrolling down, but this will take us past the bottom.
        $this.scrollTop(scrollHeight);
        return prevent();
    } else if (up && delta > scrollTop) {
        // Scrolling up, but this will take us past the top.
        $this.scrollTop(0);
        return prevent();
    }
});

本质上,它的作用是检测请求滚动的方向(基于originalEvent.wheelDelta:正=up,负=down)。如果mousewheel 事件的请求delta 将滚动超过&lt;div&gt;topbottom,请取消该事件。

尤其是在 IE 中,滚动事件越过子元素的可滚动区域,然后滚动到父元素,并且无论事件被取消,滚动都会继续。因为我们在任何情况下都取消了事件,然后通过jQuery来控制child上的滚动,所以这是被阻止的。

这大致基于this question解决问题的方式,但不需要插件,跨浏览器兼容IE9+。

Here is a working jsFiddle 演示实际代码。

Here is a working jsFiddle 演示代码在运行中,并更新为与 IE 一起使用。

Here is a working jsFiddle 演示代码在运行中,并更新为与 IE 和 FireFox 一起使用。有关更改必要性的更多详细信息,请参阅this post

【讨论】:

  • 一开始我很高兴看到这个简单的解决方案(在谷歌浏览器中有效),但后来我在 IE9 中尝试了小提琴。 IE 总是让我们失望:@
  • @Ejay IE9 问题是否与使用 this.scrollTop/Height 而不是 $(this).scrollTop()/Height() 有关?我认为this.scrollTop在IE中总是0?
  • 现在工作正常。我的 scrollHeight 因我有一些东西而减少了 20,所以我只添加了“-20”,这很好。
  • @Ejay:我更新了代码以使用 IE。 :) @Kato:好主意,但不是这样。当delta 大于可用的滚动高度时,它与IE 不遵守取消的mousewheel 事件有关。荒谬 - 但更新后的代码修复了它。
  • 遗憾的是,这也不适用于 Windows 7 上的 IE9 或 IE10 中的 iFrame。尚未在其他任何地方进行测试。在 Chrome、Firefox 或 Opera 中没有问题。
【解决方案2】:

也许可以看看

How to disable scrolling temporarily?

这是一个停止和激活滚动的示例

【讨论】:

  • 会看看,谢谢。
  • 我认为这会禁用所有滚动。我想保持 div 元素可滚动。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-06
  • 1970-01-01
相关资源
最近更新 更多