ハンバーガーメニューを開いた時に背景をスクロールさせない方法!

ハンバーガーメニュー・ドロワーメニューを開いた時に背景を固定したい、背景のスクロールを無効にしたい

この記事では、上記の悩みを解決するために、ハンバーガーメニューを開いた時に背景を固定する方法(背景のスクロールを無効化する方法)について、JavaScript(jQuery)を使って解説します。

目次

完成イメージ

完成イメージ1
完成イメージ2

上記は私の作成途中のポートフォリオサイトのヘッダー部分ですが、今回は上記を参考に、ハンバーガーメニューを開いた時に後ろの部分を固定する方法について解説します。

ハンバーガーボタンの作り方については下記記事で詳しく解説していますので、参考にしてみてください

ハンバーガーメニューのHTML

HTML

    <header class="header">
        <div class="header__inner">
            <h1 class="header__logo">
                <a href="#">
                    <img src="./img/logo.png" alt="YUYA ポートフォリオ">
                </a>
            </h1>
            <button id="js-drawer-icon" class="header__open drawer-icon">
                <span class="drawer-icon__bar"></span>
                <span class="drawer-icon__bar"></span>
                <span class="drawer-icon__bar"></span>
                <span class="drawer-icon__bar"></span>
            </button>
            <nav id="js-drawer-content" class="header__nav">
                <ul class="header__lists">
                    <li class="header__list">
                        <a href="#service" class="header__link">Service</a>
                    </li>
                    <li class="header__list">
                        <a href="#works" class="header__link">Works</a>
                    </li>
                    <li class="header__list">
                        <a href="#about" class="header__link">About</a>
                    </li>
                    <li class="header__list">
                        <a href="#contact" class="header__link">Contact</a>
                    </li>
                </ul>
            </nav>
        </div>
    </header>

HTMLのコードは上記のようになります。

「button id = “js-drawer-icon”」の部分がハンバーガーボタンで「nav id = “js-drawer-content”」の部分が実際に表示されるメニュー部分になります。

この「button」と「nav」にあてているidを使ってJavaScriptでハンバーガーメニューを開いている時には背景を固定するように設定していきます。

JavaScript(jQuery)を使って背景を固定する方法

ハンバーガーメニューを開いている時に背景(HTMLのbodyタグの部分)のスクロールを無効にするには「body」に「overflow:hidden;」を設定することで無効化できます。

ただ、CSSで

body {
  overflow:hidden;
}

のように設定してしまうと、常にスクロールが無効になってしまいますので、ハンバーガーメニューが開いている時のみ、「body」に「overflow:hidden;」を設定する必要があります。

jQuery("#js-drawer-icon").on("click", function(e) {
    e.preventDefault();
    jQuery("#js-drawer-icon").toggleClass("is-checked");
    jQuery("#js-drawer-content").toggleClass("is-checked");

    if (jQuery("#js-drawer-content").hasClass("is-checked")) {
        // メニューが開いている間はスクロールを無効にする
        jQuery("body").css("overflow", "hidden");
    } else {
        // メニューが閉じたらスクロールを有効にする
        jQuery("body").css("overflow", "");
    }
});

jQuery("#js-drawer-content a").on("click", function() {
    jQuery("#js-drawer-icon").removeClass("is-checked");
    jQuery("#js-drawer-content").removeClass("is-checked");
    jQuery("body").css("overflow", "");
});

上記のJavaScriptのコードでハンバーガーメニューが開いている時(id「js-drawer- content」に「is-checked」クラスがついている時)のみ、「body」に「overflow:hidden;」を設定し、それ以外の時は「body」の「overflow:hidden;」を外すことができます。

また、HTMLで「js-drawer-content」内の<a>タグをクリックした時にも「is-checked」クラスを外し、「body」の「overflow:hidden;」を外す処理を追加しないと、

完成イメージ2

上記画像で「Service」をクリックしてServiceの部分に移動した時にそこからスクロールできない、という現象が発生してしまうため、

jQuery("#js-drawer-content a").on("click", function() {
    jQuery("#js-drawer-icon").removeClass("is-checked");
    jQuery("#js-drawer-content").removeClass("is-checked");
    jQuery("body").css("overflow", "");
});

上記処理で、対応しています。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

CAPTCHA


目次