jQuery或Javascript – 如何禁用没有溢出的窗口滚动:隐藏;

嗨,可以禁用窗口滚动而不使用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/

尝试在除一个节点之外的所有节点上处理’mousewheel’事件

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

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

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

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

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

遵循格伦斯的想法,这是另一种可能性。 它允许你在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"); }); 

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

另一种方法是使用:

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

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

没有外部变量:

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

CSS’固定’解决方案(像Facebook一样):

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

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

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

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

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

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

注意,我在现有对象(在我的例子中是一个PopupViewModel)上存储了对disableScrollFn的引用,因为在关闭弹出窗口时可以触发对该控件的访问以禁用disableScrollFn。

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

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

支持handleWheelhandleScrollbarhandleKeysscrollEventKeys