28

overflow:hidden;嗨,当我悬停一个元素时,是否可以禁用窗口滚动而不使用?

我试过了:

$('.chat-content').on('mouseenter',function(){
    $(document).scroll(function(e){
        if(!$(e).hasClass('.chat-content'))
        e.stopPropagation();
        e.preventDefault();
    });
});

我的意思是,我想让滚动条可见,但是当我用鼠标滚动出元素时,窗口不会滚动,而我结束的元素可以滚动

所以禁用身体滚动但不禁用元素我已经结束而不使用css

这是我做的另一个尝试:http: //jsfiddle.net/SHwGL/

4

8 回答 8

46

尝试在除一个以外的所有节点上处理“鼠标滚轮”事件

$('body').on({
    'mousewheel': function(e) {
        if (e.target.id == 'el') return;
        e.preventDefault();
        e.stopPropagation();
    }
})

演示:http: //jsfiddle.net/DHz77/1/

于 2013-11-06T17:06:14.017 回答
6

如果你想滚动你结束的元素并阻止窗口滚动,这里有一个非常有用的功能:

$('.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();
    }
});

将“可滚动”类应用于您的元素,就是这样!

于 2014-07-10T00:53:45.187 回答
2

按照格伦的想法,这里有另一种可能性。它将允许您在 div 内滚动,但会阻止主体在 div 滚动结束时随之滚动。但是,如果滚动太多,它似乎会累积太多 preventDefault,如果您想向上滚动,它会产生延迟。有人建议解决这个问题吗?

    $(".scrollInsideThisDiv").bind("mouseover",function(){
       var bodyTop = document.body.scrollTop;
       $('body').on({
           'mousewheel': function(e) {
           if (document.body.scrollTop == bodyTop) return;
           e.preventDefault();
           e.stopPropagation();
           }
       });
    });
    $(".scrollInsideThisDiv").bind("mouseleave",function(){
          $('body').unbind("mousewheel");
    });
于 2014-05-02T20:27:42.830 回答
1

tfe 在 StackOverflow 上的另一篇文章中回答了这个问题:已回答

另一种方法是使用:

$(document).bind("touchmove",function(event){
  event.preventDefault();
});

但它可能会阻止一些 jquery 移动功能正常工作。

于 2013-11-06T16:57:38.190 回答
1

没有外部变量:

       $('.element').bind('mousewheel', function(e, d) {
            if((this.scrollTop === (this.scrollHeight - this.offsetHeight) && d < 0)
                || (this.scrollTop === 0 && d > 0)) {
                e.preventDefault();
            }
        });
于 2015-11-05T13:28:47.860 回答
0

CSS“固定”解决方案(就像 Facebook 一样):

body_temp = $("<div class='body_temp' />")
    .append($('body').contents())
    .css('position', 'fixed')
    .css('top', "-" + scrolltop + 'px')
    .width($(window).width())
    .appendTo('body');

切换到正常状态:

var scrolltop = Math.abs($('.body_temp').position().top);
$('body').append($('.body_temp').contents()).scrollTop(scrolltop);
于 2014-07-12T09:30:05.450 回答
0

在这个线程上有很多好主意。我的页面中有很多用于处理用户输入的弹出窗口。我使用的是禁用鼠标滚轮和隐藏滚动条的组合:

this.disableScrollFn= function(e) { 
    e.preventDefault(); e.stopPropagation() 
};
document.body.style.overflow = 'hidden';
$('body').on('mousewheel', this.disableScrollFn);

这样做的好处是我们可以阻止用户以任何可能的方式滚动,而无需更改 css 位置和顶部属性。我不关心触摸事件,因为触摸外部会关闭弹出窗口。

要禁用此功能,请在关闭弹出窗口后执行以下操作。

document.body.style.overflow = 'auto';
$('body').off('mousewheel', this.disableScrollFn);

请注意,我在现有对象(在我的情况下为 PopupViewModel)上存储了对我的 disableScrollFn 的引用,因为在关闭弹出窗口以访问 disableScrollFn 时会触发该引用。

于 2015-05-10T03:09:42.267 回答
-1

您可以使用jquery-disablescroll来解决问题:

  • 禁用滚动:$window.disablescroll();
  • 再次启用滚动:$window.disablescroll("undo");

支持handleWheel、和。handleScrollbar_handleKeysscrollEventKeys

于 2016-11-26T23:12:15.917 回答