从停止滚动页面,如果盘旋的div [复制](Stop page from scrolling if

2019-09-01 16:22发布

这个问题已经在这里有一个答案:

  • 防止父元素的滚动时内部元件滚动位置到达顶部/底部? [重复] 30个答案

我有一个div是滚动的,但每当你到达它的底部/顶部,它开始滚动整个页面。 这可能是恼人谁滚动快速用户,然后整个页面开始滚动意外。

我需要的东西在那里,如果你将鼠标悬停在格,页面不可滚动。

我已经通过添加CSS当我将鼠标悬停在div尝试这个...

body {
    overflow:hidden;
}

......它的工作原理,但有一个问题。 滚动条消失,看起来挺傻的把它消失/重新出现。 任何的方式来达到同样的效果,但保持滚动条可见? 我已经看到了与Facebook聊天结束。

Answer 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 )。 如果所请求的delta的的mousewheel事件将移动滚动过去的topbottom<div>取消该事件。

在IE中,尤其是,它晃过一个子元素的滚动区域滚动事件,然后汇总到父元素,并且继续滚动不管事件被取消。 因为我们取消在任何情况下的事件,然后控制通过jQuery的孩子滚动,这被阻止。

这是松散的基础上,该方法这个问题解决了问题,但不需要插件,并且是跨浏览器IE9与兼容+。

这里是一个工作的jsfiddle表明其操作中的代码。

这里是一个工作的jsfiddle表明其操作中的代码,并更新了IE浏览器的工作。

这里是一个工作的jsfiddle表明其操作中的代码,并更新了IE和Firefox的工作。 见这个职位有关的变化的必要性的更多细节。



Answer 2:

也许有一个看看

如何禁用暂时滚动?

这是一个示例停止和启动滚动



文章来源: Stop page from scrolling if hovering div [duplicate]