どうも!かけちまるです!
サイトのスクロールを一時的に無効にしたいことがあると思います。
例えば、モーダルウィンドウが開いている時や、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かお問い合わせフォームから受け付けております。