CSSアニメーションの学習お疲れ様でした!少し難しいプロパティも多く苦戦された方も多いかと思います。改めて習得度演習を通して理解を深めていきましょう!

本演習の目的

  • 参考コードを見ながらハンバーガーメニューの実装を行えるようになる
  • 記載されているコードのロジックを理解する
  • コードの意味を理解し出来上がっているサイトに対して追記を行えるようになる

進め方について

以前お作りいただいたポートフォリオにコードを追記する形にてハンバーガーメニューの作成を行ってください。

アニメーションロジックについての指定はありませんが、参考コードを本ページの下部に記載しております。

また、下記仕様を前提としてください。

  • 1000px以下にハンバーガーメニューを表示させる
  • ハンバーガーメニューの表示と同時にグルーバルメニューは非表示にする

ハンバーガーメニューとは?

ハンバーガーメニューとはスマートフォンサイトなどで用いられるメニューです。
三本線のアイコンがハンバーガーに見えるためそう名付けられました。この三本線のボタンをタップするとメニューが展開し、もう一度タップするとメニューが収納されます。下記参考画像となります。

ハンバーガーメニューの実装手順サンプル

①ボタン部分の実装

まず三本線のボタンを実装してみましょう。
HTMLとCSSは以下になります。

<header>
    <div class="hamburger-menu">
        <input type="checkbox" id="menu-btn-check">
        <label for="menu-btn-check" class="menu-btn"><span></span></label>
    </div>
</header>
HTML

.menu-btn {
    position: fixed;
    top: 10px;
    right: 10px;
    display: flex;
    height: 60px;
    width: 60px;
    justify-content: center;
    align-items: center;
    z-index: 90;
    background-color: #3584bb;
}
.menu-btn span,
.menu-btn span:before,
.menu-btn span:after {
    content: '';
    display: block;
    height: 3px;
    width: 25px;
    border-radius: 3px;
    background-color: #ffffff;
    position: absolute;
}
.menu-btn span:before {
    bottom: 8px;
}
.menu-btn span:after {
    top: 8px;
}
CSS

ボタンがタップされたかどうかの判断はチェックボックスで行いますので、ボタンをタップしチェックボックスにチェックが入ることを確認します。

三本線は<span>タグと疑似要素で作成します。
それではボタンがタップされたとき三本線を「×」マークにするために、CSSに記述を追加してみましょう。

#menu-btn-check:checked ~ .menu-btn span {
    background-color: rgba(255, 255, 255, 0);/*メニューオープン時は真ん中の線を透明にする*/
}
#menu-btn-check:checked ~ .menu-btn span::before {
    bottom: 0;
    transform: rotate(45deg);
}
#menu-btn-check:checked ~ .menu-btn span::after {
    top: 0;
    transform: rotate(-45deg);
}
CSS

三本線の真ん中が消え、上下の二本が「×」マークになったことを確認します。

最後に下記CSSを追加してチェックボックスを隠せばボタンの実装は完了です。

#menu-btn-check {
    display: none;
}
CSS

②メニュー部分の実装方法

ボタンが実装出来たら、次にメニュー部分の実装をします。
先ほどのHTMLにメニューのコーディングを追加していきます。
ボタンの実装時に記述したチェックボックスの状態によってメニューの表示非表示を判断しますので、メニューは必ずチェックボックスと同じ階層に記述するようにしましょう。

<header>
    <div class="hamburger-menu">
        <input type="checkbox" id="menu-btn-check">
        <label for="menu-btn-check" class="menu-btn"><span></span></label>
        <!--ここからメニュー-->
        <div class="menu-content">
            <ul>
                <li>
                    <a href="#">メニューリンク1</a>
                </li>
                <li>
                    <a href="#">メニューリンク2</a>
                </li>
                <li>
                    <a href="#">メニューリンク3</a>
                </li>
            </ul>
        </div>
        <!--ここまでメニュー-->
    </div>
</header>
HTML

メニューの装飾CSSは下記になります。

.menu-content {
    width: 100%;
    height: 100%;
    position: fixed;
    top: 0;
    left: 0;
    z-index: 80;
    background-color: #3584bb;
}
.menu-content ul {
    padding: 70px 10px 0;
}
.menu-content ul li {
    border-bottom: solid 1px #ffffff;
    list-style: none;
}
.menu-content ul li a {
    display: block;
    width: 100%;
    font-size: 15px;
    box-sizing: border-box;
    color:#ffffff;
    text-decoration: none;
    padding: 9px 15px 10px 0;
    position: relative;
}
.menu-content ul li a::before {
    content: "";
    width: 7px;
    height: 7px;
    border-top: solid 2px #ffffff;
    border-right: solid 2px #ffffff;
    transform: rotate(45deg);
    position: absolute;
    right: 11px;
    top: 16px;
}
CSS

メニューのz-indexはボタンよりも小さい値にすること、positionはfixedにして追従するようにすること以外は参考程度で問題ありません。

この記述ではメニューは常に出ている状態なので、ボタンを押したらメニューが出てくるように記述を追加・変更します。
まず、メニューを画面の外へ飛ばします。

.menu-content {
    width: 100%;
    height: 100%;
    position: fixed;
    top: 0;
    left: 100%;/*leftの値を変更してメニューを画面外へ*/
    z-index: 80;
    background-color: #3584bb;
    transition: all 0.5s;/*アニメーション設定*/
}
CSS

次に下記記述を追加して、ボタンがタップされたとき、すなわちチェックボックスにチェックがついたとき、メニューが画面に表示されるようにします。

#menu-btn-check:checked ~ .menu-content {
    left: 0;/*メニューを画面内へ*/
}
CSS

ボタンのタップによってメニューが表示されるようになりました。

この時、transitionでアニメーション時間を設定しておくとよりなめらかにメニューが移動しますので、ボタンによって開閉されているということがよりユーザーに伝わりやすくなります。
これでハンバーガーメニューの実装が完了しました。

TOP