detailsとsummaryの開示ウィジェット
JavaScriptなしでネイティブの展開・折りたたみコンポーネントを作成します
「detailsとsummaryの開示ウィジェット」はCoddyKit上の無料HTML Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはHTML Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 HTML Academyコースには全4レッスンが含まれています。
detailsとsummaryとは何ですか
<details>要素と<summary>要素を使うと、JavaScriptなしでネイティブの開示ウィジェット(展開と折りたたみを行うコンポーネント)を作成できます:
<details>
<summary>What is HTML?</summary>
<p>HTML (HyperText Markup Language) is the standard markup language
used to create web pages.</p>
</details>仕組み
操作の動作:
- デフォルトでは、
<summary>だけが表示されます - summaryをクリックすると、残りのコンテンツの表示と非表示が切り替わります
- デフォルトでは、summaryに開示用の三角形が表示されます
- JavaScriptは必要ありません
open属性
open属性を指定すると、details要素をあらかじめ展開した状態にできます:
<details open>
<summary>Installation instructions</summary>
<ol>
<li>Download the installer</li>
<li>Run the installer</li>
<li>Restart your computer</li>
</ol>
</details>
<!-- open is a boolean attribute: presence = expanded -->
<!-- Remove it to start collapsed -->FAQの作成
FAQのセクションは、最適な使用例です:
<h2>Frequently Asked Questions</h2>
<details>
<summary>Is HTML5 a programming language?</summary>
<p>No. HTML5 is a markup language that defines the structure and meaning
of web content. Programming languages like JavaScript add logic and behavior.</p>
</details>
<details>
<summary>Do I need to close void elements?</summary>
<p>In HTML5, void elements like <img> and <br> do not require
a closing slash. Both <br> and <br /> are valid.</p>
</details>detailsとsummaryのスタイル設定
外観をカスタマイズします:
details {
border: 1px solid #e2e8f0;
border-radius: 0.5rem;
padding: 0.75rem 1rem;
margin-bottom: 0.5rem;
}
summary {
font-weight: 600;
cursor: pointer;
list-style: none; /* remove default triangle */
}
summary::before {
content: '▶ '; /* custom arrow */
}
details[open] > summary::before {
content: '▼ '; /* rotate when open */
}デフォルトの三角形を削除する
開示用の三角形は、list-styleによって適用されます:
/* Remove the default arrow: */
summary {
list-style: none;
}
/* Firefox: */
summary::-webkit-details-marker {
display: none;
}
/* Then add a custom indicator: */
summary::after {
content: '+';
float: right;
}
details[open] summary::after {
content: '−';
}toggleイベント
toggleイベントを使って、開閉を監視します:
const details = document.querySelector('details');
details.addEventListener('toggle', () => {
if (details.open) {
console.log('Details opened');
// Track analytics, load content, etc.
} else {
console.log('Details closed');
}
});detailsによるアコーディオン
基本的なアコーディオンを作成します。一度に1つのパネルだけを開けるようにします:
/* Pure CSS accordion using details: */
/* Each item is a details element */
/* For exclusive open, use JavaScript: */
const allDetails = document.querySelectorAll('details');
allDetails.forEach(d => {
d.addEventListener('toggle', () => {
if (d.open) {
allDetails.forEach(other => {
if (other !== d) other.removeAttribute('open');
});
}
});
});detailsとsummaryのアクセシビリティ
組み込みのアクセシビリティ機能:
- summaryはキーボードフォーカスを受け取り、EnterまたはSpaceで操作できます
- スクリーンリーダーはsummaryのテキストと展開状態を読み上げます
- 非表示のコンテンツはDOM内に存在しますが、展開されるまでは非表示として読み上げられます
排他的なアコーディオンのname属性
HTML 2025では、ネイティブの排他的なアコーディオンを実現するために、detailsにnameが追加されます:
<details name="faq">
<summary>Question 1</summary>
<p>Answer 1...</p>
</details>
<details name="faq">
<summary>Question 2</summary>
<p>Answer 2...</p>
</details>
<!-- details with the same name act as a group -->
<!-- Opening one closes the others automatically -->
<!-- Supported in Chrome 120+ and Firefox 130+ -->toggleによるコンテンツの遅延読み込み
detailsが開かれたときだけコンテンツを読み込みます:
<details id="advanced">
<summary>Load advanced settings...</summary>
<div id="advanced-content">Loading...</div>
</details>
<script>
const d = document.getElementById('advanced');
d.addEventListener('toggle', async () => {
if (d.open) {
const res = await fetch('/api/settings');
const html = await res.text();
document.getElementById('advanced-content').innerHTML = html;
d.removeEventListener('toggle', arguments.callee);
}
}, { once: true });
</script>確認問題
detailsの開示ウィジェットで、常に表示されるトリガーテキストを提供する要素はどれですか?
復習:詳細と概要
ディスクロージャーウィジェットの要点:
<details>+<summary>— JavaScriptなしでネイティブの展開・折りたたみに対応しますopen属性 — あらかじめ展開した状態にします- toggle イベント — 展開・折りたたみに反応します
- CSSでスタイルを設定します。list-style: none でデフォルトの三角形を削除できます
name属性 — 排他的なアコーディオンを作成します(Chrome 120以降)
よくある質問
「detailsとsummaryの開示ウィジェット」レッスンは無料ですか?
はい。「detailsとsummaryの開示ウィジェット」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、HTML Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 HTML Academyコースには全4レッスンが含まれています。
「detailsとsummaryの開示ウィジェット」で何を学びますか?
JavaScriptなしでネイティブの展開・折りたたみコンポーネントを作成します ブラウザで直接実行するハンズオンコードでHTML Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
HTML Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのHTML Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。
「detailsとsummaryの開示ウィジェット」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このHTML Academyレッスンでコードを書いて実行できますか?
はい。すべてのHTML Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- asideと補足コンテンツ
- figureとfigcaption再入門
- detailsとsummaryの開示ウィジェット
- progress要素とmeter要素