如何暂时禁用滚动?

2022-08-29 23:05:50

我正在使用rollkTo jQuery插件,并想知道是否有可能通过Javascript暂时禁用窗口元素的滚动?我想禁用滚动的原因是,当您在rollkTo制作动画时滚动时,它会变得非常丑陋;)

当然,我可以做一个,然后在动画停止时将其放回自动状态,但如果滚动条仍然可见但不活动,那就更好了。$("body").css("overflow", "hidden");


答案 1

该活动无法取消。但是您可以通过取消这些交互事件来执行此操作:
鼠标触摸滚动以及与滚动关联的按钮scroll

[工作演示]

// left: 37, up: 38, right: 39, down: 40,
// spacebar: 32, pageup: 33, pagedown: 34, end: 35, home: 36
var keys = {37: 1, 38: 1, 39: 1, 40: 1};

function preventDefault(e) {
  e.preventDefault();
}

function preventDefaultForScrollKeys(e) {
  if (keys[e.keyCode]) {
    preventDefault(e);
    return false;
  }
}

// modern Chrome requires { passive: false } when adding event
var supportsPassive = false;
try {
  window.addEventListener("test", null, Object.defineProperty({}, 'passive', {
    get: function () { supportsPassive = true; } 
  }));
} catch(e) {}

var wheelOpt = supportsPassive ? { passive: false } : false;
var wheelEvent = 'onwheel' in document.createElement('div') ? 'wheel' : 'mousewheel';

// call this to Disable
function disableScroll() {
  window.addEventListener('DOMMouseScroll', preventDefault, false); // older FF
  window.addEventListener(wheelEvent, preventDefault, wheelOpt); // modern desktop
  window.addEventListener('touchmove', preventDefault, wheelOpt); // mobile
  window.addEventListener('keydown', preventDefaultForScrollKeys, false);
}

// call this to Enable
function enableScroll() {
  window.removeEventListener('DOMMouseScroll', preventDefault, false);
  window.removeEventListener(wheelEvent, preventDefault, wheelOpt); 
  window.removeEventListener('touchmove', preventDefault, wheelOpt);
  window.removeEventListener('keydown', preventDefaultForScrollKeys, false);
}

更新:固定的Chrome桌面和具有被动侦听器的现代移动浏览器


答案 2

只需在正文中添加一个类即可:

.stop-scrolling {
  height: 100%;
  overflow: hidden;
}

添加类,然后在要重新启用滚动时将其删除,该类已在IE,FF,Safari和Chrome中进行了测试。

$('body').addClass('stop-scrolling')

对于移动设备,您需要处理以下事件:touchmove

$('body').bind('touchmove', function(e){e.preventDefault()})

并解除绑定以重新启用滚动。在 iOS6 和 Android 2.3.3 中测试

$('body').unbind('touchmove')