スマホでメニューを開いた時点のスクロールしていた地点に、メニューを閉じたあとにもどるようにする工夫 JavaScript
メニューを閉じたときに元いた位置から閲覧できるようにするためのJavascript
デフォルトではハンバーガーメニューを開くとスクロールが0にもどってしまうので、メニューを閉じたときに元いた位置から閲覧できるようにするための工夫。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
$(document).ready(function() { var state = false; var scrollPos; $('#openMenu').on('click', function() { if (state === false) { scrollPos = $(window).scrollTop(); // クリックした時点のスクロール量 // console.log(scrollPos); $('body').addClass('fixed').css({ 'top': -scrollPos }); // bodyを固定しスクロール量分ボディのトップを移動する $("nav").addClass('open'); $("#layer").addClass('open'); state = true; $('#layer').on('click', function() { $('body').removeClass('fixed').css({ 'top': 0 }); // いったん0に戻して window.scrollTo(0, scrollPos); // ドロワーを開いたときのスクロール位置に戻す $('nav').removeClass('open'); $(this).removeClass('open'); state = false; }); } else { $('body').removeClass('fixed').css({ 'top': 0 }); // いったん0に戻して // ドロワーを開いたときのスクロール位置に戻す bodyのtopを0にするのではなくwindowをスクロールする window.scrollTo(0, scrollPos); $('nav').removeClass('open'); $("#layer").removeClass('open'); state = false; } }); }); |
今回メニューを開いているときにスクロールを禁止しているのはhtmlかbodyにposition: fixed; width: 100%; height: 100%;を付与していることに因る。
JavaScriptで書いた方が見通しはいいかも。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
document.addEventListener('DOMContentLoaded', (): void => { const body: HTMLElement | null = document.querySelector('html') || document.querySelector('body'); const menuBtn: HTMLElement | null = document.getElementById('openMenu'); const nav: HTMLElement | null = document.querySelector('nav'); const layer: HTMLElement | null = document.getElementById('layer'); let scrollPos: number = 0; // スクロール量を取得する関数をつくる function getScroll() { return Math.max(document.documentElement.scrollTop, document.body.scrollTop, window.scrollY); } menuBtn?.addEventListener('click', (): void => { if (body?.classList.contains('fixed') || nav?.classList.contains('open') || layer?.classList.contains('open')) { body.classList.remove('fixed'); nav.classList.remove('open'); layer.classList.remove('open'); } else { scrollPos = getScroll(); body?.classList.add('fixed'); nav?.classList.add('open'); layer?.classList.add('open'); } // スクロールしていたら.fixdしているbodyのtopに数値を付与する if (scrollPos !== 0) { body?.style.top = `-${String(scrollPos)}px`; } }); layer?.addEventListener('click', (): void => { body?.classList.remove('fixed'); nav?.classList.remove('open'); layer?.classList.remove('open'); // スクロールしていたらwindowをスクロール前の位置まで戻す if (scrollPos !== 0) { body?.style.top = ''; // .fixedしていたbodyからtopを削除 window.scrollTo(0, scrollPos); } }); }); |
cssによるスクロール禁止だけでなくJavascriptでスマホのスクロールを禁止する方法もある。
コメント
コメントはありません。