Scrolling child div scrolls the window, how do I stop that?

后端 未结 14 731
生来不讨喜
生来不讨喜 2020-11-30 18:03

I have a div, with a scroll bar, When it reaches the end, my page starts scrolling. Is there anyway I can stop this behavior ?

相关标签:
14条回答
  • 2020-11-30 18:42

    If I understand your question correctly, then you want to prevent scrolling of the main content when the mouse is over a div (let's say a sidebar). For that, the sidebar may not be a child of the scrolling container of the main content (which was the browser window), to prevent the scroll event from bubbling up to its parent.

    This possibly requires some markup changes in the following manner:

    <div id="wrapper"> 
        <div id="content"> 
        </div> 
    </div> 
    <div id="sidebar"> 
    </div> 
    

    See it's working in this sample fiddle and compare that with this sample fiddle which has a slightly different mouse leave behavior of the sidebar.

    See also scroll only one particular div with browser's main scrollbar.

    0 讨论(0)
  • 2020-11-30 18:43

    If you apply an overflow: hidden style it should go away

    edit: actually I read your question wrong, that will only hide the scroll bar but I don't think that's what you are looking for.

    0 讨论(0)
  • 2020-11-30 18:49
    $this.find('.scrollingDiv').on('mousewheel DOMMouseScroll', function (e) {
      var delta = -e.originalEvent.wheelDelta || e.originalEvent.detail;
      var scrollTop = this.scrollTop;
      if((delta < 0 && scrollTop === 0) || (delta > 0 && this.scrollHeight - this.clientHeight - scrollTop === 0)) {
        e.preventDefault();
      }
    });
    
    0 讨论(0)
  • 2020-11-30 18:54

    I wrote resolving for this issue

      var div;
      div = document.getElementsByClassName('selector')[0];
    
      div.addEventListener('mousewheel', function(e) {
        if (div.clientHeight + div.scrollTop + e.deltaY >= div.scrollHeight) {
          e.preventDefault();
          div.scrollTop = div.scrollHeight;
        } else if (div.scrollTop + e.deltaY <= 0) {
          e.preventDefault();
          div.scrollTop = 0;
        }
      }, false);
    
    0 讨论(0)
  • 2020-11-30 18:56

    The selected solution is a work of art. Thought it was worthy of a plugin....

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

    This has been an ongoing inconvenience for me and this solution is so clean compared to other hacks I've seen. Curious to know how more about how it works and how widely supported it would be, but cheers to Jeevan and whoever originally came up with this. BTW - stackoverflow answer editor needs this!

    UPDATE

    I believe this is better in that it doesn't try to manipulate the DOM at all, only prevents bubbling conditionally...

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

    Works great in chrome and much simpler than other solutions... let me know how it fares elsewhere...

    FIDDLE

    0 讨论(0)
  • 2020-11-30 18:57

    Found the solution.

    http://jsbin.com/itajok

    This is what I needed.

    And this is the code.

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

    Uses a jQuery Plug-in.


    Update due to deprecation notice

    From jquery-mousewheel:

    The old behavior of adding three arguments (delta, deltaX, and deltaY) to the event handler is now deprecated and will be removed in later releases.

    Then, event.deltaY must now be used:

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

    Demo

    0 讨论(0)
提交回复
热议问题