Qiita Careers powered by IndeedPR

求人サイト「Qiita Careers powered by Indeed」では、エンジニアのあなたにマッチした求人が見つかります。

11
5

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だけで作る!リッチに動くハンバーガーメニュー完全ガイド

11
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兄弟セレクタ メニュー作成

11
5
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

@mukai3's pickup articles

mukai3

@mukai3(ムカイさん)

大阪でシステムエンジニアをやってます。C#が強いです。 上流~下流まで、API連携設計、UI/UX実装、SEOパフォーマンス最適化など一気通貫で対応可能。ご相談・ご依頼はお気軽にXでDMください。

Comments

No comments

Let's comment your feelings that are more than good

Being held Article posting campaign

11
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Login to continue?

Login or Sign up with social account

Login or Sign up with your email address