1. ホーム
  2. ジャバスクリプト

[解決済み】スクロールを一時的に無効にする方法は?

2022-03-23 15:50:15

質問

scrollTo jQuery プラグインを使用していますが、Javascript を使用してウィンドウ要素のスクロールを一時的に無効にすることは可能でしょうか?スクロールを無効にしたい理由は、scrollToがアニメーションしている間にスクロールすると、本当に醜くなってしまうからです;)

もちろん $("body").css("overflow", "hidden"); しかし、スクロールバーが表示されたままで、かつ非アクティブであれば、よりよいでしょう。

解決方法は?

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

UPDATE: Chromeデスクトップとパッシブリスナーを持つモダンモバイルブラウザを修正しました。