はじめに
ハンバーガーメニュー作るとき、
「結局JavaScript書かないと無理でしょ?」って思ってないです?
いやいや、CSSだけでけっこうイケるんです。
最近のCSSはかなり進化していて、アニメーション・状態管理もわりとサクッと書けます。
この記事では「CSSオンリーでリッチに動くハンバーガーメニュー」を作る方法を、コピペOKな完全コード付きでわかりやすくまとめます。
- JS書きたくない人
- シンプルに軽量なコードで作りたい人
- HTML+CSSだけでできることを極めたい人
におすすめです。
完成イメージ
完全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兄弟セレクタ メニュー作成