ハンバーガーメニュー展開時に背景をスクロールさせない方法
- ハンバーガーメニューを開いた時、bodyタグをスクロールさせない
- ハンバーガーメニューを閉じた時、開いた時の位置に戻したい
このような悩みにお答えします。
この記事では、ハンバーガーメニューが開いている間、背景のスクロールを防ぐ方法について解説します。
この記事を読むことで、より使いやすいハンバーガーメニューを作ることができるようになります。
完成品のデモ
まずは完成品のデモを紹介します。HTML
とCSS
、jQuery
で実装しています。
通常、<body>
タグは下にスクロール可能ですが、ハンバーガーメニューが開いている間はスクロールが無効になります。
具体的な実装方法
ハンバーガーメニューの背景スクロールを制御するための方法を詳しく解説していきます。jQuery
のみで簡単に実装できます。
jQuery
を使用する際は、CDNの読み込みを忘れないようにしましょう。
以下のコードで実装することができます。
$(function () {
// ハンバーガーメニューボタンがクリックされたときのイベントハンドラを設定
$(".l-drawer-btn").click(function () {
// 現在のbodyタグのoverflowスタイルを確認
if ($("body").css("overflow") === "hidden") {
// もしoverflowがhiddenなら、bodyのスタイルを元に戻す
$("body").css({ height: "", overflow: "" });
} else {
// そうでなければ、bodyにheight: 100%とoverflow: hiddenを設定し、スクロールを無効にする
$("body").css({ height: "100%", overflow: "hidden" });
}
});
});
背景をスクロールさせないために必要なCSSは以下のとおり。
body {
height: 100%;
overflow: hidden;
}
ハンバーガーメニューボタンがクリックされた時に、上記のスタイルを切り替えるよう指定しています。
class
の着脱をし、CSS
ファイルで管理する方法もありますが、このCSS
はどのような案件でも変更することはないので、JavaScript
で直接変更しています。
今回はjQuery
を使用していますが、バニラJavaScript
を使用する場合は以下のようになります。
document.addEventListener("DOMContentLoaded", function () {
// ハンバーガーメニューボタンがクリックされたときのイベントハンドラを設定
document.querySelector(".l-drawer-btn").addEventListener("click", function () {
// body要素を取得
var body = document.body;
// 現在のbodyのスタイルを取得
var bodyStyle = window.getComputedStyle(body);
// bodyのoverflowスタイルがhiddenかどうかを確認
if (bodyStyle.overflow === "hidden") {
// もしoverflowがhiddenなら、bodyのスタイルを元に戻す
body.style.height = "";
body.style.overflow = "";
} else {
// そうでなければ、bodyにheight: 100%とoverflow: hiddenを設定し、スクロールを無効にする
body.style.height = "100%";
body.style.overflow = "hidden";
}
});
});
メニューだけをスクロール可能にする
最後に、メニューだけをスクロール可能にする方法を紹介します。
ハンバーガーメニューの内容によっては、下部が見切れて表示されなくなることがあります。
ハンバーガーメニューにoverflow:scroll;
を追加することでスクロールを可能にします。
高さの指定も必要なので、一緒に指定します。
l-drawer-nav__inner {
height: 100%;
overflow: scroll;
}
まとめ
ハンバーガーメニューが開いている間、背景スクロールを制御する方法を紹介しました。
実装のポイントは、ハンバーガーメニューの操作に応じてbody
タグのスタイルを切り替えることです。
これにより、メニューが開いている間はスクロールを防ぐことができます。