当鼠标hover在绝对div上时,jQuery禁用滚动

我试图禁用鼠标hover在div上的窗口鼠标滚动function – 以便只有div滚动启用 – 当鼠标移离div – 滚动到窗口再次应用。 div绝对定位。

我见过这个post使用jquery禁用鼠标滚轮function,当鼠标光标在一个div内? 但似乎没有提供任何答案 – 因此我的问题。

我假设它会是这样的(如果只有这些方法存在):

$('#container').hover(function() { $(window).scroll().disable(); $(this).scroll().enable(); }, function() { $(window).scroll().enable(); }); 

这是一个受欢迎的问题,所以我正在更新,以概述在这里提供的答案,哪些可能是最适合你的。 包括三个独特的解决scheme。 两个来自阿莫斯,一个来自我自己。 但是,每个操作不同。

  1. 阿莫斯 – 设置overflow:hidden在身上。 这很简单,效果很好。 但主窗口的滚动条会闪烁。
  2. 阿莫斯 – 使用JavaScript来禁用鼠标滚轮。 如果你根本不需要鼠标滚轮,这真是太好了。
  3. 这个答案 – 使用JavaScript滚动只是你已经结束的元素。 如果你的内部div需要滚动,这是最好的答案,但你不希望任何其他div滚动。 示例小提琴展示了这一点。

http://jsfiddle.net/eXQf3/371/

代码工作如下:

  • 捕捉当前元素上的滚动事件
  • 取消滚动事件
  • 手动只滚动当前元素
 $('#abs').bind('mousewheel DOMMouseScroll', function(e) { var scrollTo = null; if (e.type == 'mousewheel') { scrollTo = (e.originalEvent.wheelDelta * -1); } else if (e.type == 'DOMMouseScroll') { scrollTo = 40 * e.originalEvent.detail; } if (scrollTo) { e.preventDefault(); $(this).scrollTop(scrollTo + $(this).scrollTop()); } });​ 

更新日志:

  • FF支持
  • scrollTo null检查以恢复默认行为,以防万一发生不可预见的情况
  • 支持jQuery 1.7。

您不能禁用窗口滚动,但有一个简单的解决方法:

 //set the overflow to hidden to make scrollbars disappear $('#container').hover(function() { $("body").css("overflow","hidden"); }, function() { $("body").css("overflow","auto"); }); 

看演示: http : //jsfiddle.net/9Htjw/


UPDATE

你可以禁用鼠标滚轮。

 $('#container').hover(function() { $(document).bind('mousewheel DOMMouseScroll',function(){ stopWheel(); }); }, function() { $(document).unbind('mousewheel DOMMouseScroll'); }); function stopWheel(e){ if(!e){ /* IE7, IE8, Chrome, Safari */ e = window.event; } if(e.preventDefault) { /* Chrome, Safari, Firefox */ e.preventDefault(); } e.returnValue = false; /* IE7, IE8 */ } 

资料来源: http : //solidlystated.com/scripting/javascript-disable-mouse-wheel/

演示: http : //jsfiddle.net/9Htjw/4/

mrtsherman:如果你像这样绑定事件,amosrivera的代码也适用于firefox:

  var elem = document.getElementById ("container"); if (elem.addEventListener) { elem.addEventListener ("mousewheel", stopWheel, false); elem.addEventListener ("DOMMouseScroll", stopWheel, false); } else { if (elem.attachEvent) { elem.attachEvent ("onmousewheel", stopWheel); } } 

我正在试图在这里与我的代码是:

  • 检查div是否被盘旋或被淹没

  • 获取滚动方向

  • 将ScrollTop与容器的高度进行比较,并在达到最大值或最小值时(直到模糊不清),防止进一步滚动。

     var hovered_over = false; var hovered_control; function onCrtlMouseEnter(crtl) { //Had same thing used for mutliple controls hovered_over = true; //could be replaced with $(control).onmouseenter(); etc hovered_control = crtl; //you name it } function onCrtlMouseLeave(crtl) { hovered_over = false; hovered_control = null; } $(document).on("mousewheel",function(e) { if (hovered_over == true) { var control = $(hovered_control); //get control var direction = e.originalEvent.wheelDeltaY; //get direction of scroll if (direction < 0) { if ((control.scrollHeight - control.clientHeight) == control.scrollTop) { return false; //reached max downwards scroll... prevent; } } else if (direction > 0) { if (control.scrollTop == 0) { return false; //reached max upwards scroll... prevent; } } } }); 

http://jsfiddle.net/Miotonir/4uw0vra5/1/

可能不是最干净的代码,它可以很容易地改善,但这对我的作品。 (control.scrollHeight - control.clientHeight)这部分对我来说是有问题的,但是你应该知道如何处理这个问题。

我在我的页面上使用nicescroll没有方法的工作。 我意识到nicescroller正在调用scroll事件,并且在hover元素时不得不暂时禁用nicescroll。

解决scheme:hover元素时暂时禁用nicescroll

 $('body').on('mouseover', '#element', function() { $('body, html').css('overflow', 'auto').getNiceScroll().remove(); }).on('mouseout', '#element', function() { $('body, html').css('overflow', 'hidden').niceScroll(); });