WEBサイトで「アコーディオン」といえば、クリックするとパネルが開閉するUIの定番パターンですね。
多くの場合、JavaScriptと組み合わせて実装することがほとんどだと思います。
でも、CSSだけでもシンプルなアコーディオンを実装できるのをご存じですか?
今回は、CSSの:checked擬似クラスと、+セレクタを活用して、JavaScriptなしでトグル式アコーディオンを実装する方法をご紹介します!
こんな方におすすめ
- JSなしで軽量にUIを実装したい
- HTMLとCSSだけでサクッとアコーディオンを作りたい
- 初心者だけど、コード付きで理解したい
実際にこのような画像のような「アコーディオン」コンテンツを作成することができます。
HTMLソース(基本形)
<label class="accordion-label"> <input type="checkbox" class="accordion-toggle"> <span class="accordion-title">Q. アコーディオンって何?</span> <div class="accordion-content"> アコーディオンは、クリックで開閉するUIパターンです。 </div> </label>
CSS(基本形)
.accordion-label { display: block; cursor: pointer; margin-bottom: 1em; border: 1px solid #ccc; padding: 1em; border-radius: 5px; } .accordion-toggle { display: none; } .accordion-title { font-weight: bold; display: block; } .accordion-content { max-height: 0; overflow: hidden; transition: max-height 0.4s ease; } .accordion-toggle:checked + .accordion-title + .accordion-content { max-height: 200px; /* 適宜調整 */ }
実装のポイント
- チェックのON/OFFをCSSで判定可能
- :checked 擬似クラスで条件分岐が可能
ここがポイント:+セレクタを使うことで、チェックされたら、2つ後ろの .accordion-content にCSSを与えることができます。ここで max-height を付与して展開させるアコーディオンの動きが実装できます。
.accordion-toggle:checked + .accordion-title + .accordion-content
応用:複数アコーディオンを並べたい場合
各アコーディオンごとに異なるIDを使って、labelとinputを関連付けることでグループ化も可能です。
inputのidとlabelのfor属性で結びつければ、マークアップの自由度も上がります。
HTMLソース
<div class="accordion"> <div class="accordion-item"> <input type="checkbox" id="ac1" class="accordion-toggle"> <label for="ac1" class="accordion-title">Q1. CSSだけでアコーディオンは作れますか?</label> <div class="accordion-content"> はい、できます!チェックボックスと疑似クラスを組み合わせて実現できます。 </div> </div> <div class="accordion-item"> <input type="checkbox" id="ac2" class="accordion-toggle"> <label for="ac2" class="accordion-title">Q2. JavaScriptとの違いは?</label> <div class="accordion-content"> 簡易的な用途にはCSSのみで十分ですが、複雑な制御や状態管理はJSが得意です。 </div> </div> <div class="accordion-item"> <input type="checkbox" id="ac3" class="accordion-toggle"> <label for="ac3" class="accordion-title">Q3. 複数開けますか?</label> <div class="accordion-content"> はい、チェックボックス形式なので複数同時に開閉可能です。 </div> </div> </div>
CSS
.accordion { max-width: 600px; margin: 2em auto; font-family: sans-serif; } .accordion-item { border: 1px solid #ccc; border-radius: 5px; margin-bottom: 1em; overflow: hidden; } .accordion-toggle { display: none; } .accordion-title { display: block; padding: 1em; font-weight: bold; background-color: #f7f7f7; cursor: pointer; position: relative; } .accordion-title::after { content: "+"; position: absolute; right: 1em; font-size: 1.2em; transition: transform 0.3s; } .accordion-toggle:checked + .accordion-title::after { content: "−"; transform: rotate(180deg); } .accordion-content { max-height: 0; overflow: hidden; padding: 0 1em; background-color: #fff; transition: max-height 0.4s ease, padding 0.4s ease; } .accordion-toggle:checked + .accordion-title + .accordion-content { max-height: 200px; padding: 1em; }
CSSアコーディオン実装時の注意点
- 開閉状態を保持できない:
ページを再読み込みすると、アコーディオンはすべて閉じた状態に戻ります。状態の保持が必要な場合はJavaScriptの導入が必要です。 - アクセシビリティ(a11y)には注意が必要:
aria-expanded や role=”region” などを併用しないと、スクリーンリーダーには適切に伝わらない可能性があります。 - アニメーションに制約がある:
max-height を使ったアニメーションは、コンテンツ量に応じて調整が必要です(高さが足りないと途中で切れる)。 - 表示切替には display: none を使用しない:
display: none はSEO的にもコンテンツが無視されることがあるため、max-height での非表示が推奨されます。 - ラベルとチェックボックスのIDが正しく対応していないと動作しない:
label の for 属性と input の id 属性は一致していなければなりません。 - 古いブラウザでは非対応の可能性:
IE11以前やレガシー環境では :checked や transition の挙動が不安定なことがあります。
CSSだけでトグル式アコーディオンを作るのは意外と簡単。
JavaScriptが使えない場面や、できるだけ軽量にUIを構築したいときにおすすめのテクニックです。