Owned media

Hisa Web - オウンドメディア

2025年2月13日

最小限のコードでハンバーガーメニューを作る方法【CSS/jQuery】

  • 記事をシェアする:
  • LINEのロゴ

今回は最小限のコードでハンバーガーメニューを作る方法をご紹介します。

様々な記事で実装方法が紹介されていますが、この記事では、

初学者でも簡単に実装ができる」「余計なアニメーションやコードは省略」 

といった、よりプレーン(装飾のない)状態のハンバーガーメニューの実装方法をご紹介します。

コピペで使用可能です。担当されている案件のデザインに合わせてご使用ください。

デモ:完成のイメージ

まずは、簡単なデモをご覧ください。

ハンバーガーボタンをクリックすると、グローバルメニューが表示されます。

縦幅が足りない場合は、縦スクロールができるようになっています。

ソースコード解説

上記デモに使用したソースコードを、HTML、CSS、jQueryに分けて解説していきます。

HTMLの解説

まずは、ハンバーガーボタンとグローバルメニューを作成します。

jQueryでactiveクラスを付け外し、CSSでactiveクラスの有無による表示切り替えを実現させるの土台づくりです。

    <header class="header">
        <div class="header__inner">
            <button class="hamburger header__hamburger" type="button" aria-label="ハンバーガーメニュー開閉"
                aria-controls="global-menu">
                <span class="hamburger__line"></span>
                <span class="hamburger__line"></span>
                <span class="hamburger__line"></span>
            </button>
            <div class="global-menu">
                <div class="global-menu__contents">
                    <ul class="global-menu__nav">
                        <li class="global-menu__nav-item">
                            <a href="#">トップページ</a>
                        </li>
                        <li class="global-menu__nav-item">
                            <a href="#">サービス</a>
                        </li>
                        <li class="global-menu__nav-item">
                            <a href="#">会社概要</a>
                        </li>
                    </ul>
                </div>
            </div>
        </div>
    </header>

ハンバーガーボタンはspanタグで作成します。spanタグに色を付けてcssアニメーションによって開く⇔閉じるの効果を表現します。

CSS(SCSS)の解説

次にCSSです。

ここでは主に、activeクラスの付け外しに伴うスタイルの変更と、ハンバーガーボタンと展開メニューの配置指定を行っています。

.header {
    position: relative; // 基準点として指定(.hamburger の absolute 配置の基準)
    height: 70px;
    background-color: gray;
}

.hamburger {
    position: absolute; // 絶対位置指定(.header を基準に配置)
    top: 50%;
    transform: translateY(-50%);
    right: 40px;
    width: 32px; // ハンバーガーボタンの横幅
    height: 20px; // ハンバーガーボタンの縦幅
    z-index: 1010; // 展開メニューは 1000 で指定
    padding: 0; // button タグのデフォルトのスタイルをリセット
    background: none;
    border: none;

    span {
        position: absolute;
        width: 100%; // .hamburger の width が線の横幅
        height: 2px; // 線の太さ
        left: 50%; // 中央配置
        transform: translateX(-50%);
        background-color: black;
    }

    span:nth-child(1) {
        top: 0; // 一番上の線
    }

    span:nth-child(2) {
        top: 50%;
        transform: translate(-50%, -50%); // 中央の線
    }

    span:nth-child(3) {
        bottom: 0; // 一番下の線
    }

    &.active {
        span {
            &:nth-of-type(2) {
                display: none; // 中央の線を非表示にして、上下の線のみ残す
            }
            &:nth-of-type(1) {
                transform: translateX(-50%) translateY(calc(50% + 9px)) rotate(-45deg);
                // -45° 回転でバツ印を作る(上の線)
            }
            &:nth-of-type(3) {
                transform: translateX(-50%) translateY(calc(50% - 9px)) rotate(45deg);
                // 45° 回転でバツ印を作る(下の線)
            }
        }
    }
}

/////* ハンバーガーメニュークリック後に出てくる領域 */////
.global-menu {
    position: fixed; // 画面に追従
    top: 0;
    bottom: 0;
    right: 0;
    left: 0;
    z-index: 1000; // .hamburger は 1010
    opacity: 0; // 初期状態は透明
    pointer-events: none; // ポインターイベントを禁止(クリックできない状態)
    background-color: lightblue;

    &.active {
        opacity: 1; // 不透明化し、表示
        pointer-events: all; // クリックを許可
    }

    &__contents {
        box-sizing: border-box;
        width: 100%;
        height: 100%; // .global-menu の高さと一致させる
        overflow: auto; // メニューが多い場合はスクロールできるようにする
        padding: 70px 20px;
    }

    &__nav-item {
        border-bottom: 1px dashed black;

        a {
            display: block;
            text-decoration: none;
            padding: 20px 0;
        }
    }
}

(注意)今回はハンバーガーボタンと展開メニューをposition: absolute;で配置することを想定しています。

したがって実案件で、すでに親要素にpositionプロパティが指定されている場合、意図した挙動にならない可能性があるのでご注意ください。

jQueryの解説

次は、jQueryです。

ここでは主に、ハンバーガーボタンをクリックした場合のactiveクラスの付け外しと、展開メニューのいずれかの場所をクリックしたら展開メニューを閉じる制御を行っています。

$(function() {
    // ハンバーガーボタンとメニューの要素を取得
    const $hamburger = $('.hamburger');
    const $globalMenu = $('.global-menu');

    // ハンバーガーボタンがクリックされたときの処理
    $hamburger.click(function () {
        $hamburger.toggleClass('active'); // ハンバーガーのクラスをトグル(開閉)
        
        if ($hamburger.hasClass('active')) {
            // ハンバーガーが「active」になったらメニューを表示
            $globalMenu.addClass('active');
        } else {
            // ハンバーガーが非アクティブならメニューを非表示
            $globalMenu.removeClass('active');
        }
    });

    // メニューのどこかをクリックしたら閉じる処理
    $globalMenu.click(function (e) {
        $globalMenu.removeClass('active'); // メニューを非表示
        $hamburger.removeClass('active'); // ハンバーガーの状態も元に戻す
    });
});

上記コードでは、activeクラスの付け外しによるハンバーガーボタンの見た目の変化と展開メニューの表示切り替えを行っています。

またそれとは別に、ハンバーガーボタン以外のページリンクやメニュー背景をクリックしたときに展開メニューが閉じるための制御も記述しています。

(実際にはactiveクラスを.global-menuにつけ外ししているだけなので、見た目上の表示切替はCSS側で行っています。)

まとめ

今回の記事では、よりシンプルにハンバーガーメニューが実装できる方法をご紹介しました。

別記事では、このプレーン状態のハンバーガーメニューをより実践的な内容にカスタマイズする方法もご紹介しますので、ぜひそちらも合わせてお読みください。

最後までお読みいただきありがとうございました。

それでは、また別記事でお会いいたしましょう!

Contact

お問い合わせ・無料相談

サイト制作や運用について、
どのようなご状況でもご相談可能です。

お好きな方法でご連絡ください。
内容を確認次第、1~2営業日以内にご返信いたします。

サービスのモックアップ
Faq

よくある質問

  • はい、WordPressなどのCMSを導入することで、ご自身で簡単に更新できるように制作します。使い方の説明やマニュアルの提供も行っていますので、初めての方でも安心です。

  • もちろん可能です。現在の課題やご要望をお伺いし、最新のデザインや機能を取り入れたリニューアルをご提案いたします。お気軽にご相談ください。

  • はい、すべてのサイトをレスポンシブデザインで制作します。スマートフォンやタブレットなど、あらゆる端末で最適に表示されるよう設計していますのでご安心ください。

  • 制作後も安心して運用いただけるよう、保守・管理サービスをご用意しています。更新作業やセキュリティ対策、定期的なバックアップなどを月額5,000円〜で承ります。もちろん、ご自身で管理されたい場合にもサポートいたします。

  • 料金はサイトのページ数やデザインの複雑さ、追加機能の有無によって異なります。基本的な企業サイトの場合は300,000円〜が目安です。詳細なお見積もりは無料で行っておりますので、お気軽にご相談ください。

  • 通常、ホームページ制作にかかる期間はプロジェクトの規模や内容によりますが、一般的な企業サイトであれば約4〜8週間を目安にしています。具体的なスケジュールはヒアリング後にご提案させていただきます。

Contact

お問い合わせ

  • 無料
    相談・見積
  • 全国オンライン
    対応可能
  • 制作担当者が
    ヒアリング

「サイトが欲しいけど、どうしたらいいかわからない」
といった場合でもご案内可能です。

ご相談、お見積りは無料です。お気軽にご連絡くださいませ。