2025 07 . 16 WED
CSSのみでアコーディオンメニューを作成する方法|:target疑似クラスとcheckboxを活用
Web開発・フロントエンド

CSSのみでアコーディオンメニューを作成する方法|:target疑似クラスとcheckboxを活用

2025.07.16

このサイトはアフィリエイト広告を利用しています。

はじめに

こんにちは。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">
<div class="accordion-item">
<a href="#item1" class="accordion-trigger">
質問1:CSSのみでアコーディオンは作れますか?
</a>
<div id="item1" class="accordion-content">
<p>はい、:target疑似クラスを使用することで、JavaScriptを使わずにアコーディオンメニューを実装できます。</p>
</div>
</div>
<div class="accordion-item">
<a href="#item2" class="accordion-trigger">
質問2:ブラウザ対応はどうですか?
</a>
<div id="item2" class="accordion-content">
<p>:target疑似クラスは IE9以降の全てのモダンブラウザで対応しています。</p>
</div>
</div>
</div>

CSSでのスタイリング

基本的なアコーディオンメニュー

実行結果

💪 ヒント

:target疑似クラスはページ内リンクと組み合わせて使用するため、SEO的にも有効です。検索エンジンは各セクションを個別のコンテンツとして認識できます。

checkboxを使用した複数展開可能なアコーディオン

:target疑似クラス の制限を克服し、複数のアコーディオンを同時に開きたい場合は、checkbox を活用します。

実装方法

複数展開可能なcheckboxアコーディオン

実行結果

柴犬アイコン

複数同時に開けるのは本当に便利ですよね!比較しながら見たい時に重宝します。

実装方法の比較と選び方

各実装方法の特徴を比較して、適切な選択をしましょう。

機能比較表

特徴:target版checkbox版
複数同時展開❌ 1つのみ✅ 複数可能
URL変更✅ ハッシュが追加❌ 変更なし
直リンク共有✅ 可能❌ 不可
ブラウザ戻る✅ 履歴に残る❌ 履歴なし
実装の複雑さシンプルやや複雑
アクセシビリティ普通良好

使い分けのポイント

:target版を選ぶべき場合:

  • SEO対策を重視する場合
  • 直リンク共有が必要な場合
  • シンプルな実装を優先する場合

checkbox版を選ぶべき場合:

  • 複数項目の比較が必要な場合
  • FAQ やヘルプページなど、複数の情報を同時に参照したい場合
  • アクセシビリティを重視する場合

📢 重要

プロジェクトの要件に応じて適切な実装方法を選択することが重要です。特にSEOや直リンク共有が必要な場合は:target版、ユーザビリティを重視する場合はcheckbox版を検討してください。

アクセシビリティとパフォーマンス

アクセシビリティの向上

スクリーンリーダーなどの支援技術に対応するため、適切な ARIA 属性を追加しましょう:

<div class="accordion" role="presentation">
<div class="accordion-item">
<a href="#item1"
class="accordion-trigger"
role="button"
aria-expanded="false"
aria-controls="item1">
質問1:アクセシビリティは重要ですか?
</a>
<div id="item1"
class="accordion-content"
role="region"
aria-labelledby="trigger1">
<p>はい、すべてのユーザーがアクセスできるようにすることが大切です。</p>
</div>
</div>
</div>

パフォーマンス最適化

CSS疑似クラス を使用したアコーディオンのメリット:

  • 軽量性: JavaScriptファイルが不要
  • 高速な読み込み: CSSのみで動作
  • エラー耐性: JavaScriptのエラーを回避
  • 保守性: シンプルな構造で保守しやすい

高度な実装テクニック

閉じるボタンの追加

:target版 にて、アコーディオンを閉じるための仕組みを追加:

<div class="accordion-content">
<div class="accordion-inner">
<p>コンテンツ内容</p>
<a href="#" class="accordion-close">閉じる</a>
</div>
</div>

アニメーション強化版

より自然なアニメーション効果を実現するための CSS:

アニメーション強化版checkboxアコーディオン

実行結果

よくある質問

複数のアコーディオンを同時に開くことはできますか?

: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属性の追加で支援技術に対応
柴犬アイコン

実際にプロジェクトで使ってみると、checkbox版の方が使い勝手が良いケースが多いんですよね。ユーザーが自由に操作できるのが魅力的です。

ただし、複雑な操作や高度なアクセシビリティ対応が必要な場合は、JavaScriptとの組み合わせも検討してみてください。用途に応じて適切な実装方法を選択できるとよいですね。

この記事が、CSS アコーディオンメニュー実装の 参考になれば嬉しいです

著者アイコン
コッチ フロントエンドエンジニア

フロントエンドエンジニア歴10年。コロナ禍を機にフル在宅ワークへ移行。Web開発の知見を活かし、AI活用法や仕事が捗るガジェットについて発信しています。柴犬が好きです。