<details>要素
Technical Summary
details要素は、利用者が追加情報または操作項目を取得できるdisclosure widgetを表します。最初のsummary要素が開閉のsummaryまたはlegendになり、残りの内容が追加情報または操作項目になります。
openは表示状態を表すboolean attributeです。同じtreeにある非空のnameを持つdetailsをグループ化すると、user agentが排他的な開閉を処理します。これはtab widgetやmenu widgetを表すための要素ではありません。
Definition / Categories
| 項目 | 仕様上の整理 |
|---|---|
| 意味 | 追加情報または操作項目を開閉するdisclosure widget |
| Categories | Flow content、Interactive content、Palpable content |
| Context | Flow contentが期待される場所 |
| Content model | 1個のsummary要素に続くFlow content |
| Content attributes | Global attributes、name、open |
| DOM interface | HTMLDetailsElement。open IDL attributeを持つ |
Disclosureとsummaryの判定
最初のsummary element childが、そのdetailsのsummaryになります。summaryがない場合、user agentは独自のlegend(たとえば「Details」)を提供できます。開閉対象の内容は、summary以外の残りの子孫です。
<details>
<summary>実装条件を確認する</summary>
<p>ここが追加情報または操作項目です。</p>
</details>
summaryのcontent modelはPhrasing contentで、heading contentを任意に混在させられます。ただし、開閉のラベルとして使う情報は、閉じた状態でも内容を推測できる短い文字列に保つほうが、読み手と支援技術の確認に向いています。
ネイティブの開閉例
この例では、ページ側のJavaScriptなしに、user agentがopenの有無と開閉UIを処理します。
open状態とactivation
openはboolean attributeです。属性が存在すればsummaryと追加内容を表示し、存在しなければsummaryだけを表示します。summaryのactivationによって、user agentは親detailsのopen属性を設定または削除します。
const details = document.querySelector('details');
details.open; // open属性を反映するboolean
details.toggleAttribute('open');
details.addEventListener('toggle', (event) => {
console.log(event.oldState, event.newState);
});
open属性の変更では、toggle eventがqueueされます。短時間に連続して状態を変更した場合、notification taskはcoalesceされ、すべての中間状態について個別にeventが発火するとは限りません。属性値の変更、現在の表示、eventのタイミングを同じものとして扱わないことが重要です。
nameによる排他的グループ
同じtreeにあり、空でない同じ値のname属性を持つdetailsは、同じdetails name groupになります。グループ内で1つを開くと、他の開いている要素のopen属性が削除されます。ページの初期markupに同じグループのopen要素を複数置くことはできません。
SPEC
仕様上の主張を確認する範囲です。
IMPL
ブラウザーで再現して観測する範囲です。
同時に複数の内容を比較することが目的なら、排他的グループにしないほうが適切です。排他的なaccordionが利用者にとって便利か、内容を何度も開き直す負担になるかを、情報設計の条件として確認します。
Content modelと利用境界
| 構造 | 確認点 |
|---|---|
最初のsummary | 開閉のsummaryまたはlegendとして扱われる |
| summary以外のFlow content | 開いたときに表示される追加情報または操作項目 |
openなし | summaryだけが表示され、追加内容は閉じた状態 |
nameが同じ | 同じtree・非空値の要素で排他的グループを形成する |
detailsはdisclosure widgetを表すための要素です。tab widget、menu widget、footnote、dialogなど、異なる意味や相互作用を持つUIを、見た目が似ているという理由だけでdetailsに置き換えません。
DOM Interface
HTMLDetailsElementのopenは、現在のopen attributeの有無をbooleanとして反映します。仕様上の開閉状態を読み取るときは、attribute文字列の値ではなく、このboolean状態とhasAttribute()の意味を分けて扱います。
const details = document.querySelector('#settings');
const summary = details.querySelector(':scope > summary');
details.open;
details.hasAttribute('open');
summary.textContent;
Fact / Evidence(主張 / 根拠)
要素の意味、summaryの判定、状態変更、排他的グループを、主張・条件・根拠位置に分けて記録します。ブラウザーの開閉UIとアクセシビリティツリーは、下のImplementation Evidenceへ分離しています。
| 種別 | Fact / 主張 | 条件・範囲 | 状態 | 根拠 |
|---|---|---|---|---|
| SPEC | detailsは追加情報または操作項目のdisclosure widgetを表し、最初のsummaryがそのsummaryまたはlegendになります。 | 意味、context、content model、summaryの選択。 | 確認済み | HTML Standard: details element |
| SPEC | openはboolean attributeで、summaryと追加内容の表示状態を表します。 | 属性の有無、summary activation、初期状態と現在状態。 | 確認済み | HTML Standard: open state |
| SPEC | openの変更はtoggle eventをqueueし、連続した変更では通知がcoalesceされます。 | details notification task、ToggleEvent、oldState/newState。 | 確認済み | HTML Standard: details notification task |
| SPEC | 同じtreeにある非空の同じnameを持つdetailsは、最大1つだけopenになるdetails name groupを形成します。 | グループの所属、open属性の相互排他、初期markupの制約。 | 確認済み | HTML Standard: details name group |
| SPEC | summaryはdetailsの最初のsummary element childである場合に、その親detailsのsummaryになります。 | first child、summary selection、activation behavior。 | 確認済み | HTML Standard: summary element |
Evidence
- HTML Standard: The details element — 意味、categories、content model、open、name group、toggle通知、DOM interface
- HTML Standard: The summary element — summaryの選択条件、content model、activation behavior
- HTML Accessibility API Mappings — detailsとsummaryのrole、name、expanded stateの確認入口
- Web Platform Tests: the-details-element — details、summary、open、name groupに関係するテスト群の入口
Implementation Evidence
仕様上の主張とは別に、ブラウザー実装・WPT・アクセシビリティ観測を記録します。今回の追加時点では専用fixtureを実行していないため、未確認の項目を確認済みとは扱いません。
専用fixture: details-v1は次回の実測で、初期open、summary activation、IDL状態、toggle event、同一nameグループの相互排他を再現するための候補IDです。現時点ではfixtureファイルと実行結果を登録していません。
| 種別 | 再現確認の範囲 | 記録する条件 | 状態 |
|---|---|---|---|
| IMPL | summaryのactivation、openのIDL反映、toggle event、name group | Chrome・Firefox・Safari、OS、確認日、fixture ID details-v1、初期markupと動的変更を記録する | 未実施 |
| WPT | details、summary、open、toggle、exclusive details name groupの個別テスト | the-details-element配下の選定ファイルを実行し、browser・実行日・pass/fail・未実行理由を記録する | 未実施 |
| AAM | summaryのrole・accessible name、detailsのexpanded state、開閉後のtree | ブラウザーAccessibility tree、HTML-AAM、可能なら支援技術で、closed/openとname groupを分けて観測する | 未実施 |
ネイティブの開閉表示、disclosure marker、キーボード操作、Accessibility treeの公開はuser agent・OS・状態に依存し得ます。1環境の観測を、すべてのブラウザーに共通する結果として登録しません。
Coverage / Open Issues
- 確認済み意味、Categories、Context、Content model、content attributes、DOM interface
- 確認済みsummaryの選択条件、openのboolean state、toggle notification、nameによる排他モデル
- 未完了Chrome・Firefox・Safariでのsummary activation、open反映、toggle event、name groupの比較
- 未完了disclosure marker、閉じた内容のrendering、動的挿入・移動・連続toggleの実装差異
- 未完了WPTの個別実行結果、HTML-AAMのmapping、Accessibility tree、支援技術別の観測
このページは初期Coverageです。仕様上の範囲を整理したものであり、すべてのブラウザーで同じ開閉表示・event timing・アクセシビリティAPI結果になること、またdetails要素全体の検証が完了したことを主張しません。
Related surface
初心者向けの開閉部品、summary、open、nameの使い方はYugienのdetails要素ページを参照してください。dialogとの意味・相互作用の境界はdialog要素、操作の意味はbutton要素、スクリプトとの境界はscript要素、フォーム送信との境界はform要素などの関連Topicでも確認できます。