CSSのみで実装するアコーディオン式ナビゲーションメニュー。JavaScriptを使わずにチェックボックスのハック技法を活用しています。
<input type="checkbox" id="menuToggle" class="menu-toggle" />
<label for="menuToggle" class="toggle-btn"></label>
<nav class="nav-menu">
<ul>
<li><a href="#home">Home</a></li>
...
</ul>
</nav>
input[type="checkbox"]
は実際には非表示にしますが、HTMLの中で重要な役割を果たします。label要素のfor属性とinputのidを紐付けることで、labelをクリックするとチェックボックスのON/OFFが切り替わります。
.menu-toggle {
display: none; /* チェックボックス自体は非表示 */
}
ユーザーにはチェックボックスを見せず、代わりにlabel要素をクリック対象とします。
.toggle-btn {
font-size: 24px;
background: none;
color: #333;
cursor: pointer;
text-align: center;
}
.toggle-btn::after {
content: " ▼"; /* 下向き三角形 */
font-size: 16px;
}
::after 疑似要素で三角形の矢印を追加しています。これによりHTMLを汚さずに装飾を追加できます。
.nav-menu {
max-height: 0; /* 初期状態で非表示 */
overflow: hidden; /* はみ出した部分を隠す */
transition: max-height 1s ease; /* アニメーション */
}
height: autoはtransitionが効きません。そのため、max-heightを使って十分に大きな値(500pxなど)を指定することで、スムーズなアニメーションを実現しています。
.menu-toggle:checked ~ .nav-menu {
display: block;
max-height: 500px; /* メニューの高さに応じて調整 */
}
:checked 疑似クラスでチェックボックスがONの時を検知。~(一般兄弟セレクタ)で後に続く.nav-menuのスタイルを変更します。
@media screen and (max-width: 767px) {
.nav-menu ul {
flex-direction: column;
}
}
767px以下の画面幅では、Flexboxの方向をcolumnに変更してメニューを縦並びにします。
.menu-toggle:checked ~ .toggle-btn::after { transform:
rotate(180deg); })