
どうも!かけちまるです!
サイトのスクロールを一時的に無効にしたいことがあると思います。
例えば、モーダルウィンドウが開いている時や、OPアニメーション後に必ずメインビジュアルを見せたい時などにこれから紹介するスクロールを無効にする方法が使えると思います。
この記事では、
がわかります。
実はCSSで簡単に実装する方法もあるのですが色々弊害があるのです。
具体的には、html
とbody
要素にoverflow: hidden;
を指定するだけです。
そんでもって弊害というのが、
の3つなのでこの記事に書いてあるJavaScriptでスクロールを無効にする方法をマスターすることをオススメします。
この記事ではボタンをクリックすることによってスクロールを無効&有効を切り替れるようにしていきます。
実装例はこちらです。
何をしているか簡単に説明すると、id=”off”
とid=”on”
をそれぞれクリックした時にtouchmove
イベントとwheel
イベントを実行したり削除したりしています。
JavaScriptコピーfunction noscroll(e){ e.preventDefault(); } $('#off').on('click', function(){ document.addEventListener('touchmove', noscroll, {passive: false}); document.addEventListener('wheel', noscroll, {passive: false}); }); $('#on').on('click', function(){ document.removeEventListener('touchmove', noscroll); document.removeEventListener('wheel', noscroll); });
touchmove
・・・1つ以上のタッチポイントが移動した時(スマホでスクロールした時)wheel
・・・マウスやタッチパッドでスクロールした時e.preventDefault();
・・・イベントのデフォルト動作を無効にすることができます。passive: false
・・・これを指定しないと一部のイベントでe.preventDefault();
がうまく動作しない。5行目 | id=”off”をクリックした時
addEventListenerの第一引数でtouchmove
イベントとwheel
イベントを登録します。addEventListener
の第二引数で1行目のnoscroll
関数を呼び出しe.preventDefault();
でイベントの動作を無効にします。addEventListener
の第三引数はpassive: false
指定してe.preventDefault();
が正常に動作するようにしています。
10行目 | id=”on”をクリックした時
removeEventListener
でtouchmove
イベントとwheel
イベントを登録を解除しています。
おわり
フィードバックを送信
記事についてのフィードバックはTwitterかお問い合わせフォームから受け付けております。