はじめに
こんにちは。Webサイトを作っていると、FAQ や説明文を整理するのに アコーディオンメニュー が欲しくなることがありますよね。
私も以前、お客様のサイトで「JavaScriptは使いたくないけれど、アコーディオンメニューは実装したい」という要望をいただいたことがありました。そんな時に活用できるのが CSS疑似クラス です。
CSSのみでアコーディオンメニューを作成する方法は、軽量でメンテナンスしやすく、JavaScriptのエラーを気にする必要もありません。ここでは、:target疑似クラス と checkbox を使った2つの実装方法を、実際のコードとともにまとめてみました。よろしければ、ご覧ください。
:target疑似クラスを使用した基本実装
:target疑似クラス は、URLのハッシュ(#)でリンクされた要素にスタイルを適用する CSS セレクターです。
graph LR
A[リンクをクリック] --> B[URLにハッシュが追加]
B --> C[該当するIDの要素が:target状態]
C --> D[CSSスタイルが適用される]
:target疑似クラスの動作フロー
HTML構造の作成
まず、アコーディオンメニューの基本的なHTML構造を作成します:
<div class="accordion-item">
<a href="#item1" class="accordion-trigger">
<div id="item1" class="accordion-content">
<p>はい、:target疑似クラスを使用することで、JavaScriptを使わずにアコーディオンメニューを実装できます。</p>
<div class="accordion-item">
<a href="#item2" class="accordion-trigger">
<div id="item2" class="accordion-content">
<p>:target疑似クラスは IE9以降の全てのモダンブラウザで対応しています。</p>
CSSでのスタイリング
基本的なアコーディオンメニュー
実行結果
<div class="accordion-item">
<a href="#item1" class="accordion-trigger">
<div id="item1" class="accordion-content">
<p>はい、:target疑似クラスを使用することで、JavaScriptを使わずにアコーディオンメニューを実装できます。</p>
<div class="accordion-item">
<a href="#item2" class="accordion-trigger">
<div id="item2" class="accordion-content">
<p>:target疑似クラスは IE9以降の全てのモダンブラウザで対応しています。</p>
border-bottom: 1px solid #eee;
.accordion-item:last-child {
background-color: #f8f9fa;
transition: background-color 0.2s;
.accordion-trigger:hover {
background-color: #e9ecef;
.accordion-trigger::after {
transform: translateY(-50%);
transition: transform 0.2s;
transition: max-height 0.3s ease;
/* :target疑似クラスでアコーディオンを開く */
.accordion-content:target {
.accordion-content:target + .accordion-trigger::after {
transform: translateY(-50%) rotate(45deg);
💪 ヒント
:target疑似クラスはページ内リンクと組み合わせて使用するため、SEO的にも有効です。検索エンジンは各セクションを個別のコンテンツとして認識できます。
checkboxを使用した複数展開可能なアコーディオン
:target疑似クラス の制限を克服し、複数のアコーディオンを同時に開きたい場合は、checkbox を活用します。
実装方法
複数展開可能なcheckboxアコーディオン
実行結果
<div class="checkbox-accordion">
<div class="accordion-item">
<input type="checkbox" id="check1" class="accordion-checkbox">
<label for="check1" class="accordion-label">
質問1:checkboxを使うメリットは何ですか?
<div class="accordion-panel">
<div class="accordion-inner">
<p>checkboxを使用することで、複数のアコーディオンを同時に開くことができます。また、:target疑似クラスと違ってURLが変更されません。</p>
<div class="accordion-item">
<input type="checkbox" id="check2" class="accordion-checkbox">
<label for="check2" class="accordion-label">
<div class="accordion-panel">
<div class="accordion-inner">
<p>labelとinputの関連付けにより、キーボード操作やスクリーンリーダーでの操作性が向上します。</p>
<div class="accordion-item">
<input type="checkbox" id="check3" class="accordion-checkbox">
<label for="check3" class="accordion-label">
<div class="accordion-panel">
<div class="accordion-inner">
<p>はい、この実装では好きなだけ複数のアコーディオンを同時に開くことができます。</p>
border-bottom: 1px solid #eee;
.accordion-item:last-child {
background-color: #f8f9fa;
transition: background-color 0.2s;
background-color: #e9ecef;
.accordion-label::after {
transform: translateY(-50%);
transition: transform 0.3s ease;
transition: max-height 0.4s ease;
.accordion-checkbox:checked + .accordion-label + .accordion-panel {
.accordion-checkbox:checked + .accordion-label::after {
transform: translateY(-50%) rotate(45deg);
.accordion-checkbox:checked + .accordion-label {
background-color: #e3f2fd;
実装方法の比較と選び方
各実装方法の特徴を比較して、適切な選択をしましょう。
機能比較表
特徴 | :target版 | checkbox版 |
---|
複数同時展開 | ❌ 1つのみ | ✅ 複数可能 |
URL変更 | ✅ ハッシュが追加 | ❌ 変更なし |
直リンク共有 | ✅ 可能 | ❌ 不可 |
ブラウザ戻る | ✅ 履歴に残る | ❌ 履歴なし |
実装の複雑さ | シンプル | やや複雑 |
アクセシビリティ | 普通 | 良好 |
使い分けのポイント
:target版を選ぶべき場合:
- SEO対策を重視する場合
- 直リンク共有が必要な場合
- シンプルな実装を優先する場合
checkbox版を選ぶべき場合:
- 複数項目の比較が必要な場合
- FAQ やヘルプページなど、複数の情報を同時に参照したい場合
- アクセシビリティを重視する場合
📢 重要
プロジェクトの要件に応じて適切な実装方法を選択することが重要です。特にSEOや直リンク共有が必要な場合は:target版、ユーザビリティを重視する場合はcheckbox版を検討してください。
アクセシビリティとパフォーマンス
アクセシビリティの向上
スクリーンリーダーなどの支援技術に対応するため、適切な ARIA 属性を追加しましょう:
<div class="accordion" role="presentation">
<div class="accordion-item">
class="accordion-trigger"
class="accordion-content"
aria-labelledby="trigger1">
<p>はい、すべてのユーザーがアクセスできるようにすることが大切です。</p>
パフォーマンス最適化
CSS疑似クラス を使用したアコーディオンのメリット:
- 軽量性: JavaScriptファイルが不要
- 高速な読み込み: CSSのみで動作
- エラー耐性: JavaScriptのエラーを回避
- 保守性: シンプルな構造で保守しやすい
高度な実装テクニック
閉じるボタンの追加
:target版 にて、アコーディオンを閉じるための仕組みを追加:
<div class="accordion-content">
<div class="accordion-inner">
<a href="#" class="accordion-close">閉じる</a>
アニメーション強化版
より自然なアニメーション効果を実現するための CSS:
アニメーション強化版checkboxアコーディオン
実行結果
<div class="enhanced-checkbox-accordion">
<div class="accordion-item">
<input type="checkbox" id="enhance1" class="accordion-toggle">
<label for="enhance1" class="accordion-header">
<span class="accordion-title">高度な機能1:スムーズなアニメーション</span>
<span class="accordion-icon"></span>
<div class="accordion-content">
<div class="accordion-body">
<p>この実装では、より自然なアニメーション効果を実現しています。</p>
<p>複数の段落や要素も美しく表示されます。</p>
<div class="accordion-item">
<input type="checkbox" id="enhance2" class="accordion-toggle">
<label for="enhance2" class="accordion-header">
<span class="accordion-title">高度な機能2:カスタムアイコン</span>
<span class="accordion-icon"></span>
<div class="accordion-content">
<div class="accordion-body">
<p>カスタムアイコンにより、より現代的な外観を実現できます。</p>
<p><strong>ポイント:</strong> CSS疑似要素を使用してアイコンを作成</p>
.enhanced-checkbox-accordion {
box-shadow: 0 2px 10px rgba(0,0,0,0.1);
.enhanced-checkbox-accordion .accordion-item {
border-bottom: 1px solid #f0f0f0;
.enhanced-checkbox-accordion .accordion-item:last-child {
.enhanced-checkbox-accordion .accordion-toggle {
.enhanced-checkbox-accordion .accordion-header {
justify-content: space-between;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
transition: all 0.3s ease;
.enhanced-checkbox-accordion .accordion-header:hover {
background: linear-gradient(135deg, #5a6fd8 0%, #6a4190 100%);
transform: translateY(-1px);
.enhanced-checkbox-accordion .accordion-title {
.enhanced-checkbox-accordion .accordion-icon {
transition: transform 0.3s ease;
.enhanced-checkbox-accordion .accordion-icon::before,
.enhanced-checkbox-accordion .accordion-icon::after {
transition: transform 0.3s ease;
.enhanced-checkbox-accordion .accordion-icon::before {
.enhanced-checkbox-accordion .accordion-icon::after {
.enhanced-checkbox-accordion .accordion-content {
transition: max-height 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94);
.enhanced-checkbox-accordion .accordion-body {
border-top: 1px solid #e1e5f2;
.enhanced-checkbox-accordion .accordion-body p {
.enhanced-checkbox-accordion .accordion-body p:last-child {
.enhanced-checkbox-accordion .accordion-toggle:checked + .accordion-header + .accordion-content {
.enhanced-checkbox-accordion .accordion-toggle:checked + .accordion-header .accordion-icon::after {
transform: rotate(90deg);
.enhanced-checkbox-accordion .accordion-toggle:checked + .accordion-header {
background: linear-gradient(135deg, #4facfe 0%, #00f2fe 100%);
よくある質問
複数のアコーディオンを同時に開くことはできますか?
:target疑似クラスを使用した実装では、一度に開けるアコーディオンは1つだけです。これは:targetの特性上、URLに含められるハッシュが1つだけだからです。複数同時に開きたい場合は、checkbox を使用した実装を検討してください。
アニメーションをよりスムーズにするにはどうすればいいですか?
max-height の値を適切に設定することが重要です。コンテンツの高さより十分に大きな値を設定し、transition の timing-function を cubic-bezier(0.25, 0.46, 0.45, 0.94) のようなカスタム値に変更すると、よりスムーズなアニメーションになります。
IE11で動作しない場合はありますか?
:target疑似クラス自体はIE9以降で対応していますが、CSSの transition プロパティやflex レイアウトなどの組み合わせによっては、IE11で表示が崩れる場合があります。古いブラウザ対応が必要な場合は、個別にテストして確認してください。
SEO的にはどちらの実装方法が良いですか?
SEO的には:target疑似クラスを使用した実装が有利です。ハッシュリンクにより各セクションが個別のコンテンツとして認識され、直リンクでの共有も可能になります。ただし、ユーザビリティを重視する場合はcheckbox版も検討する価値があります。
モバイル端末での動作に問題はありますか?
基本的にはモバイル端末でも問題なく動作しますが、タップ領域を十分に確保し、フォントサイズを適切に設定することが重要です。また、アニメーションの速度をモバイル向けに最適化することも考慮してください。
まとめ
CSSのみでのアコーディオンメニュー は、JavaScriptを使わずに実装できる軽量で効果的な手法です。
実装のポイントをまとめると:
- :target版: SEO重視、直リンク共有が必要な場合に最適
- checkbox版: 複数同時展開、優れたアクセシビリティが必要な場合に最適
- 適切な選択: プロジェクトの要件に応じた実装方法の選定が重要
- パフォーマンス: 軽量で高速な読み込みを実現
- アクセシビリティ: 適切なARIA属性の追加で支援技術に対応
ただし、複雑な操作や高度なアクセシビリティ対応が必要な場合は、JavaScriptとの組み合わせも検討してみてください。用途に応じて適切な実装方法を選択できるとよいですね。
この記事が、CSS アコーディオンメニュー実装の 参考になれば嬉しいです 。
複数同時に開けるのは本当に便利ですよね!比較しながら見たい時に重宝します。