【问题标题】:jQuery or Javascript - how to disable window scroll without overflow:hidden;jQuery 或 Javascript - 如何在不溢出的情况下禁用窗口滚动:隐藏;
【发布时间】:2013-11-18 00:48:13
【问题描述】:

您好,当我悬停一个元素时,是否可以在不使用overflow:hidden; 的情况下禁用窗口滚动?

我试过了:

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

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

所以禁用 body 的滚动,而不是元素的滚动,我不使用 css 就结束了

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

【问题讨论】:

标签: javascript jquery css scroll


【解决方案1】:

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

另一种方法是使用:

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

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

【讨论】:

  • 不,这会阻止所有元素滚动,我希望能够滚动元素,我已经结束了
【解决方案2】:

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

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

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

【讨论】:

  • 不,这会阻止所有元素滚动,我希望能够滚动元素,我已经结束了
  • 此块仅在具有 id elementid 的元素上滚动。证明:jsfiddle.net/DHz77
  • 我好像第一次发现你的问题错了。我已经更新了答案。
  • 这在 Firefox 中不起作用。为了让它在 FF 中工作,你应该听 'DOMMouseScroll' 事件,
  • @tomericco DOMMouseScroll 事件已弃用。也许您使用的是旧版本的Firefox?参考:developer.mozilla.org/en-US/docs/DOM/DOM_event_reference/…
【解决方案3】:

按照 Glens 的想法,这里有另一种可能性。 它将允许您在 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");
    });

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • @vsync - 此代码不是禁用滚动,它只是防止当鼠标悬停在特定元素上时窗口滚动:当您到达滚动末尾时,它将开始滚动窗口(这就是这段代码所阻止的)。如果您通过拖动滚动条滚动,则不会发生这种情况。
    【解决方案5】:

    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);
    

    【讨论】:

      【解决方案6】:

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

      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。

      【讨论】:

        【解决方案7】:

        没有外部变量:

               $('.element').bind('mousewheel', function(e, d) {
                    if((this.scrollTop === (this.scrollHeight - this.offsetHeight) && d < 0)
                        || (this.scrollTop === 0 && d > 0)) {
                        e.preventDefault();
                    }
                });
        

        【讨论】:

          【解决方案8】:

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

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

          支持handleWheelhandleScrollbarhandleKeysscrollEventKeys

          【讨论】:

          • 始终欢迎提供指向潜在解决方案的链接,但请add context around the link,以便您的其他用户知道它是什么以及为什么存在。始终引用重要链接中最相关的部分,以防目标站点无法访问或永久离线。考虑到仅仅是指向外部站点的链接Why and how are some answers deleted? 的一个可能原因。
          猜你喜欢
          • 1970-01-01
          • 2022-11-24
          • 2018-03-21
          • 1970-01-01
          • 1970-01-01
          • 2018-04-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多