



WithCodeMedia-1-pc
WithCodeMedia-2-pc
WithCodeMedia-3-pc
WithCodeMedia-4-pc




WithCodeMedia-1-sp
WithCodeMedia-2-sp
WithCodeMedia-3-sp
WithCodeMedia-4-sp









生徒クライアントからアコーディオンUIを実装してほしいと言われたんですが、アクセシビリティ対応が必須らしくて…。jQueryプラグインだと対応が不十分みたいで困ってます!



それなら朗報じゃ!HTMLのdetails・summaryタグを使えば、JavaScriptなしで完全にアクセシブルなアコーディオンが作れるぞい。WCAG準拠で、スクリーンリーダーにもバッチリ対応じゃ!



そういう方法があるんですね!ぜひ教えてください!
Web制作の現場で、以下のような悩みを抱えていませんか?
本記事では、HTMLのdetails・summaryタグを活用して、JavaScriptなしでアクセシビリティに完全対応したアコーディオンUIを実装する方法を徹底解説します。
この記事を読めば、基本的なHTML実装から、スムーズなアニメーション、ブラウザ互換性対応、実践的なトラブルシューティングまで、プロフェッショナルなアコーディオン実装が身につきます。
「学習→収入」につなげた受講生のリアルな体験談も公開中!
働き方を変えたい方にも響くストーリーです。
O.Yさん
子育てと両立できる働き方を目指し、プログラミングの学習を開始する。独学での学習に限界を感じ、WithCodeの副業コースの受講を決意。最終目標から逆算した学習計画のもとスキルを習得し、卒業後に初案件を担当。現在は実案件サポートのもと、複数案件を担当している。
詳しくはこちらの記事をご覧ください。


O.Yさんの主な制作実績はこちら


これまで、アコーディオンUIを実装する場合、以下のような方法が一般的でした:
しかし、これらの方法には共通の問題がありました:
| 実装方法 | 課題 | アクセシビリティ対応 |
|---|---|---|
| jQueryプラグイン | ライブラリ依存、メンテナンスコスト高 | △(プラグイン次第) |
| チェックボックスハック | セマンティックでない、意図不明確 | ×(スクリーンリーダー誤認識) |
| カスタムJS | ARIA属性の手動管理が必須、実装複雑 | ○(正しく実装すれば可能) |
| details/summary | なし(HTML標準) | ◎(ネイティブ対応) |
世界保健機関(WHO)によると、世界人口の約15%(13億人)が何らかの障害を持っているとされています。また、日本では:
さらに、法的要件として:
アクセシビリティは「特別な配慮」ではなく、「すべてのユーザーに対する基本的な配慮」です。details・summaryタグを使えば、追加コストなくこれを実現できます。





details・summaryタグの基本構造を知りたいです!



うむ。意外とシンプルじゃ。ここでは、details・summaryタグの基本構造について解説するぞ!
アコーディオンを実装するために必要なHTMLはわずか2つのタグだけです:
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
| 操作 | 動作 |
|---|---|
| クリック | ▶︎をクリックすると開閉トグル |
| Enter/Space | キーボードで開閉トグル(フォーカス時) |
| Tab | |
| 開状態 | 属性が付与される |
| 閉状態 | open属性が削除される |
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.





details・summaryタグの実装方法を教えてください!



うむ。いい心がけじゃ!details・summaryタグの実装は、主に3つのレベルに分けて段階的に習得できる。ここでは、段階的な実装方法を紹介するぞ!
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
実装時間:5分 | 対応ブラウザ:すべて
このレベルで実現できること:
・クリックで開閉
・キーボード操作(Tab、Enter、Space)
・スクリーンリーダー完全対応
・JavaScript無効環境でも動作できる
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
実装時間:10分 | 対応ブラウザ:Chrome 120+, Edge 120+, Safari 17.2+
同じ`name`属性を指定すると、1つだけが開き、他は自動で閉じる「排他制御」が実現します:
動作: 質問1を開くと、質問2・3が自動で閉じます。
古いブラウザ(Firefox 127以前、Safari 17.2以前)では、JavaScriptで排他制御を実装します:
// 排他制御のPolyfill
document.querySelectorAll('details[name]').forEach((targetDetail) => {
targetDetail.addEventListener('toggle', () => {
if (targetDetail.open) {
const name = targetDetail.getAttribute('name');
document.querySelectorAll(`details[name="${name}"]`).forEach((detail) => {
if (detail !== targetDetail) {
detail.removeAttribute('open');
}
});
}
});
});
実装時間:30分 | 対応ブラウザ:すべて
ブラウザが表示するデフォルトの三角形アイコンを削除します:
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.





details・summaryタグのアニメーションの実装方法も知りたいです!



うむ。details・summaryタグの唯一の弱点は、デフォルトではアニメーションがないことじゃ。ここでは、スムーズなアニメーション実装方法を紹介するぞ!
対応ブラウザ:Chrome 123+, Edge 123+(Safari、Firefoxは2026年1月時点で未対応)
最新のCSS仕様 `::details-content` 疑似要素を使用します:
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
注意点: Safari/Firefoxでは動作しないため、後述のJavaScript方式が推奨です。
対応ブラウザ:すべて(IE11以外)
Web Animations APIを使用した実装です。最も信頼性が高く、推奨される方法です。
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
ポイント: コンテンツを2重divで囲むことで、paddingを保持したままheightアニメーションが可能になります。
| ポイント | 説明 |
|---|---|
| e.preventDefault() | ブラウザのデフォルト開閉動作を無効化し、カスタムアニメーションを実行 |
| isClosing / isExpanding | 連打防止フラグ。アニメーション中は新しい操作を無視 |
| offsetHeight | 要素の実際の高さを取得。auto値は使えないため動的に取得 |
| animate() | Web Animations API。jQueryのanimate()より軽量で高速 |
| onfinish | アニメーション完了時の処理。フラグをリセット |





他にも様々な実装方法を知りたいです!



おう!さらに興味を持ってくれて何よりじゃ!ここでは、実際のプロジェクトでそのまま使える、完成度の高いコード例を紹介するぞ!
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.


| ブラウザ | 基本機能 | name属性(排他制御) | ::details-content |
|---|---|---|---|
| Chrome | 12+ | 120+ | 123+ |
| Edge | 79+ | 120+ | 123+ |
| Safari | 6+ | 17.2+ | 未対応 |
| Firefox | 49+ | 127+ | 未対応 |
| Opera | 15+ | 106+ | 109+ |
| iOS Safari | 6+ | 17.2+ | 未対応 |
| Android Chrome | 4.0+ | 120+ | 123+ |
| 要件 | 推奨実装 | 理由 |
|---|---|---|
| 基本的なアコーディオン | HTMLのみ | すべてのブラウザで動作、軽量 |
| 排他制御 | HTML(name属性)+ JavaScript Polyfill | モダンブラウザはネイティブ、古いブラウザはJS |
| アニメーション | JavaScript(Web Animations API) | 全ブラウザ対応、細かい制御可能 |
| IE11対応 | jQueryプラグイン | details/summaryは非対応のため代替実装 |





details・summaryを使用するにあたってトラブルシューティングのことも知りたいです!



うむ。ここでは、主なトラブルシューティングを5つ紹介するぞい!
原因: アニメーション中に連続クリックすると、複数のアニメーションが競合
解決策: アニメーション中はクリックを無視する
onClick(e) {
e.preventDefault();
// アニメーション中は無視
if (this.isClosing || this.isExpanding) {
return;
}
// 開閉処理
}原因: Safariは::-webkit-details-markerだけでは不十分
解決策: list-styleも合わせて指定
summary {
list-style: none; /* Firefox用 */
}
summary::-webkit-details-marker {
display: none; /* Chrome, Safari用 */
}
/* Safariで確実に消すための追加指定 */
summary::marker {
display: none;
}原因: heightアニメーションはpaddingを含まない
解決策: 2重divで囲み、内側にpaddingを指定
See the Pen Untitled by せいや (@ddwkeakz-the-reactor) on CodePen.
原因: 複雑なHTMLネスト構造
解決策: シンプルな構造を保ち、不要な要素は削除する
<!-- 悪い例 -->
<details>
<div>
<div>
<summary>見出し</summary>
</div>
</div>
<p>コンテンツ</p>
</details>
<!-- 良い例 -->
<details>
<summary>見出し</summary>
<p>コンテンツ</p>
</details>
原因: モバイルブラウザの300msクリック遅延
解決策: touch-action: manipulationを指定
summary {
touch-action: manipulation; /* ダブルタップズーム無効化 */
cursor: pointer;
}




details・summaryをうまく実装するためにはどうしたら良いですか?



良い質問じゃ。ここでは、プロフェッショナルな実装をするための4つの項目を紹介するぞ!
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "FAQPage",
"mainEntity": [{
"@type": "Question",
"name": "送料はかかりますか?",
"acceptedAnswer": {
"@type": "Answer",
"text": "5,000円以上のご購入で送料無料です。"
}
}]
}
</script>

A: はい、モダンブラウザでは完全サポートされています。Chrome 12+、Firefox 49+、Safari 6+、Edge 79+で動作します。IE11は非対応のため、Polyfillまたは代替実装が必要です。
A: CSSの::details-content疑似要素を使えば可能ですが、Chrome 123+、Edge 123+のみ対応です。Safari、Firefoxでは未対応のため、全ブラウザ対応にはJavaScript(Web Animations API)の使用を推奨します。
A: 基本的には不要です。details・summaryタグは標準でWCAG 2.1レベルAA準拠です。ただし、以下のCSS実装を推奨します:
A: はい、name属性を使用します。`
同じname値を指定すると、1つが開くと他が自動で閉じます。Chrome 120+、Safari 17.2+、Firefox 127+で動作。古いブラウザ向けにJavaScript Polyfillを用意してください。
A: はい、open属性を付与します。
A: summaryの内容 + 「折りたたまれています」または「展開されています」と自動読み上げされます。開閉状態の変更も自動でアナウンスされるため、ARIA属性の手動管理は不要です。NVDA、JAWS、VoiceOverで動作確認済みです。
A: いいえ、details・summaryタグで折りたたまれたコンテンツも検索エンジンは完全にインデックスします。Googleは「ユーザビリティ向上のための折りたたみ」として評価します。FAQの場合は構造化データ(FAQPage schema)を追加実装することで、リッチリザルト表示も可能です。
A: 以下の点に注意してください:
既存のカスタムイベントやコールバック処理は、toggleイベントで再実装が必要です。
A: 問題ありません。ただし以下の対策を推奨します:
iOS Safari、Android Chromeで動作確認必須です。
A: はい、要素の中に別の要素を配置できます。親アコーディオンの開閉と子アコーディオンの開閉は独立して動作します。ただし、視覚的な階層がわかるように、インデントやボーダー色で区別することを推奨します。
A: 連打防止策を実装していない場合、アニメーションがリセットされカクつきます。解決策として、isClosingやisExpandingフラグでアニメーション中のクリックを無視する実装を推奨します。記事内のJavaScriptコード例を参照してください。
A: WordPressではGutenbergブロックとして実装可能です。Reactでは、open属性を状態管理せず、ネイティブ動作に任せるのが推奨です。制御したい場合は、useRefでDOM参照し、toggleイベントを監視してください。defaultOpenプロップでデフォルト開閉状態を設定できます。
A: はい、summary::afterに背景画像を設定できます。background-image: url(icon.svg);とし、details[open] summary::afterで別画像に切り替えます。SVGスプライトを使用すれば、HTTPリクエストを削減できます。アイコンフォント(Font Awesome等)も使用可能です。
A: はい、toggleイベントをリスニングしてトラッキングコードを実行できます:
element.addEventListener('toggle', () => {
if (element.open) {
gtag('event', 'accordion_open', {
label: summaryText
});
}
});Google Analytics、Adobe Analyticsなど各種ツールに対応可能です。
A: はい、@media printでopen属性を強制付与します:
@media print {
details {
display: block;
}
details > * {
display: block !important;
}
}印刷時はすべて展開状態で出力されます。summaryは見出しとして表示され、折りたたみ機能は無効化されます。



detailsとsummaryってこんなに便利だったんですね!これからFAQとかを作るときに使ってみます!



じゃろう?最近のHTMLはかなり進化しておる。
今回のdetailsとsummaryもその代表例じゃな!



ありがとうございます!とても勉強になりました!
本記事では、HTMLのdetailsとsummaryタグを活用した、アクセシビリティに完全対応したアコーディオンUI実装を徹底解説しました。
重要なポイントは以下の通りです。
・JavaScriptなしで動作: ネイティブ機能で開閉制御、軽量で高速
・WCAG 2.1レベルAA準拠: キーボード操作、スクリーンリーダー完全対応
・3段階の実装レベル: 最小限(HTML) → グループ化 → アニメーション
・全ブラウザ対応: Web Animations APIで信頼性の高いアニメーション
・SEO最適化: 折りたたみ内容も完全インデックス、FAQPage schemaでリッチリザルト対応
WithCodeで学んだWeb制作スキルに、アクセシブルなUI実装を組み合わせれば、すべてのユーザーに優しいWebサイトを構築できます。
大切なのは、完璧を目指さず、段階的に実装することです。
アクセシビリティ対応は「後回しにできる要素」ではなく、「最初から組み込むべき基本要件」です。details・summaryタグを使えば、追加コストなくWCAG準拠のアコーディオンUIが実装できます。
クライアントプロジェクトの品質向上、そしてご自身のスキルアップのために、今日からアクセシブルなアコーディオン実装を始めましょう!


副業・フリーランスが主流になっている今こそ、自らのスキルで稼げる人材を目指してみませんか?
未経験でも心配することはありません。初級コースを受講される方の大多数はプログラミング未経験です。まずは無料カウンセリングで、悩みや不安をお聞かせください!
WithCodeでは、Web制作の技術だけでなく、アクセシビリティ対応やWCAG準拠の実装も学べるカリキュラムを用意しています。プロとして活躍するために必要な、技術力とユーザー配慮の両方を身につけましょう。
公式サイト より
今すぐ
無料カウンセリング
を予約!