Top

CSS だけでハンバーガーメニューを設置する

モバイル表示の時右上に「≡」アイコンで設置したりするハンバーガーメニュー。通常ならば JavaScript を用いてクリック時に開くようコードを組むのが普通ですが、CSS だけで設置してみようと思います。

今回作るハンバーガーメニューはマウスホバー時に開くタイプです。ラジオボタンなどを使えばホバーではなくクリックでも開くように作れそうですが、ホバーの方が簡単なのでそちらで作ってみます。

追記
ホバーではなくクリックでメニューの開閉をするバージョンの記事を書きました。

参考:checkboxを使ってCSSだけでハンバーガーメニュー

ハンバーガー

作り方

実際に当記事でもハンバーガーメニューを設置してみました。右上の「≡」アイコンにマウスカーソルを乗せるとメニューが開きます。

menuの場所

HTML

<div id="ham-menu">
    <ul>
        <li>メニュー1</li>
        <li>メニュー2</li>
        <li>メニュー3</li>
    </ul>
</div>
<div id="menu-background"></div>

div 要素の2つで枠組みを作ります。メニューは ul 要素になっていますが別に何でも構いません。メニューだけではつまらないので黒い透過背景も付けてみました。

上の div がメニュー。下の div は黒透過背景です。

CSS

/*メニュー部分*/
#ham-menu {
    background-color: #fff; /*メニュー背景色*/
    box-sizing: border-box;
    height: 100%;
    padding: 10px 40px; /*メニュー内部上下左右余白*/
    position: fixed;
    right: -300px; /*メニュー横幅①と合わせる*/
    top: 0;
    transition: transform 0.3s linear 0s; /*0.3s は変化するのにかかる時間*/
    width: 300px; /*メニュー横幅①*/
    z-index: 1000;
}

/*メニューアイコン部分は疑似要素で*/
#ham-menu::before {
    background-color: #fff; /*ボタン部分背景色*/
    border-radius: 0 0 0 10px; /*左下角丸*/
    color: #333; /*アイコン(フォント)色*/
    content: "≡"; /*メニューアイコン*/
    display: block;
    font-size: 50px; /*アイコン(フォント)サイズ*/
    height: 50px;
    line-height: 50px; /*縦位置中央化*/
    position: absolute;
    right: 100%;
    text-align: center;
    top: 0;
    width: 50px;
}

/*透過背景部分*/
#menu-background {
    background-color: #333; /*黒背景部分背景色*/
    display: block;
    height: 100%;
    opacity: 0;
    position: fixed;
    right: 0;
    top: 0;
    transition: all 0.3s linear 0s; /*0.3s は変化するのにかかる時間*/
    width: 100%;
    z-index: -1;
}

/*hover 時の処理*/
#ham-menu:hover {
    transform: translate(-300px); /*メニュー横幅①と合わせる*/
}

#ham-menu:hover + #menu-background {
    opacity: 0.5; /*黒背景部分透過度*/
    z-index: 999;
}

hover と隣接セレクタを使って黒い背景を出しています。0.3秒かけて横位置と透過度を変化するように書いてます。

right 値ではなく translate で動かすことで、動きを滑らかにしています。とくに GoogleChrome などのブラウザでは translate で動かすことで綺麗に横移動します。

/**/ でコメントがある部分は大体変更可能ですので、デザインの変更をしたい場合はご自由に。ただ width 値の①はすべて共通にしないと表示が崩れます。注意してください。

まとめ

ただ開くだけのメニューではつまらないですが、黒背景まで付けると何となく豪華です。z-index で背景が邪魔しないよう組んでいます。

jQuery を使って実装みたいなものが多いのかな、とは思うのですが CSS だけでもそれなりのハンバーガーメニューが作れます。CSS だけでももう少し動きを豪華にしたりも可能です。

モバイル(iPhone だとメニューが開きません)のことまで考えると JavaScript を使ってしっかり実装するのがベストだと思いますが、こんな事も出来ちゃいますという紹介でした。

  • メニュー1
  • メニュー2
  • メニュー3
  1. 初めまして。

    わかりやすいハンバーガーメニューの実装の仕方公開ありがとうございます。

    自分はまだWEB初心者で実装してみたのですが、
    PCでの動作は問題ないのですが、iPhoneで見てみると全く動作しません。
    コード見ないと分からないと思うのですが、どこらへんに問題があるかわかりますか?

    2016-12-19 12:03Reply
    • iPhoneはこのCSSでは開きません。
      最初の方に書いてある追記のページのものならiPhoneでも大丈夫なので、そちらでお願いします。

      2016-12-19 14:32Reply
      • ご回答ありがとうございました。

        無事に動作しました。

        2016-12-20 13:20Reply