5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【脱・JavaScript】CSSだけで作る!リッチに動くハンバーガーメニュー完全ガイド

Last updated at Posted at 2025-06-02

はじめに

ハンバーガーメニュー作るとき、
「結局JavaScript書かないと無理でしょ?」って思ってないです?

いやいや、CSSだけでけっこうイケるんです。

最近のCSSはかなり進化していて、アニメーション・状態管理もわりとサクッと書けます。
この記事では「CSSオンリーでリッチに動くハンバーガーメニュー」を作る方法を、コピペOKな完全コード付きでわかりやすくまとめます。

  • JS書きたくない人
  • シンプルに軽量なコードで作りたい人
  • HTML+CSSだけでできることを極めたい人

におすすめです。

完成イメージ

chrome-capture-2025-6-2.gif

完全CSSのみですよ。

なぜCSSだけで作れるの?

ポイントは以下。

  • input[type="checkbox"] を状態管理に使う
  • 兄弟セレクタ(~) で他要素を制御
  • transition / transform / opacity で自然なアニメーション
  • position: fixed で重ね順を自在に制御

これだけで「押すと開く」「押すと閉じる」が成立します。
実際のコードを見たほうが早いので早速いきます。

HTML(超シンプル)

<div class="menu-wrapper">
  <input type="checkbox" id="menu-toggle" hidden>
  
  <label class="menu-icon" for="menu-toggle">
    <span></span>
    <span></span>
    <span></span>
  </label>
  
  <div class="overlay"></div>
  
  <nav class="menu">
    <ul>
      <li><a href="#">Home</a></li>
      <li><a href="#">About</a></li>
      <li><a href="#">Service</a></li>
      <li><a href="#">Contact</a></li>
    </ul>
  </nav>
</div>
  • input hidden → 状態保持用の隠しチェックボックス
  • label for → クリック可能なボタンを実現
  • 兄弟要素に影響を与える仕組みの土台

CSS(ここがキモ)

.menu-wrapper {
  position: relative;
}

.menu-icon {
  width: 40px;
  height: 30px;
  position: fixed; /* ← fixedにして常に左上固定 */
  top: 20px;
  left: 20px;
  cursor: pointer;
  z-index: 3;
  display: inline-block;
}

.menu-icon span {
  display: block;
  height: 4px;
  margin: 6px 0;
  background: #333;
  border-radius: 2px;
  transition: 0.4s;
}

/* ハンバーガーがXに変形 */
#menu-toggle:checked + .menu-icon span:nth-child(1) {
  transform: translateY(10px) rotate(45deg);
}
#menu-toggle:checked + .menu-icon span:nth-child(2) {
  opacity: 0;
}
#menu-toggle:checked + .menu-icon span:nth-child(3) {
  transform: translateY(-10px) rotate(-45deg);
}

/* オーバーレイ背景 */
.overlay {
  position: fixed;
  inset: 0;
  background: rgba(0,0,0,0.5);
  opacity: 0;
  pointer-events: none;
  transition: 0.4s;
  z-index: 1;
}

#menu-toggle:checked ~ .overlay {
  opacity: 1;
  pointer-events: auto;
}

/* メニュー本体(左から出す) */
.menu {
  position: fixed;
  top: 0;
  left: -250px; /* ← 初期位置を左へ */
  width: 250px;
  height: 100%;
  background: #fff;
  box-shadow: 2px 0 8px rgba(0,0,0,0.2);
  transition: left 0.4s ease;
  z-index: 2;
}

#menu-toggle:checked ~ .menu {
  left: 0; /* ← 開いたときは左0へ */
}

.menu ul {
  list-style: none;
  padding: 60px 20px;
}

.menu li {
  margin: 20px 0;
}

.menu a {
  text-decoration: none;
  color: #333;
  font-size: 1.2rem;
  transition: color 0.3s;
}

.menu a:hover {
  color: #007bff;
}

補足Tips

✅ アクセシビリティ
ガチ運用なら以下も足すと良い:

  • aria-controls 付与
  • role="navigation" 付与
  • フォーカス制御(Tabキー対応など)

✅ SEO・パフォーマンス

  • JSなしだから軽い
  • 初期ロードが速い
  • SPAでも全然組み込める

✅ ブラウザ対応

  • 主要ブラウザは全対応(has()は使ってないので安心)
  • IEはもう気にしなくていい時代

まとめ

  • CSSだけでここまで動く時代になってる
  • 意外とプロダクトでも使える
  • 状態管理はinputと兄弟セレクタが超便利

JS書く前に「これCSSでいけない?」って一回考えてみると、開発がだいぶラクになる。

もし役立ったらいいね・LGTMもらえると嬉しいです!

Qiitaもアルゴリズムでおすすめに出やすくなるのでぜひ!(がめつい)

関連ワード(SEO用)

CSSだけ ハンバーガーメニュー
JavaScript不要 メニュー開閉
CSSアニメーション ハンバーガー
input type="checkbox" ハンバーガー
CSS兄弟セレクタ メニュー作成

5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?