排他的アコーディオン(details name)
<details> <summary> name grid-template-rows
このページでは、<details> 要素の name 属性でグループ化するだけで実現できるJSなしの排他的アコーディオンを確認できます。基本構造とCSSアニメーション付きの2パターンを紹介します。
name 属性の仕組み
同じ name 属性値を持つ <details> グループ内では、1つが open になると他が自動的に閉じます。JavaScript不要で排他制御が実現できます。
デモ1:基本の排他アコーディオン
name 属性を同じ値に揃えるだけで排他制御が有効になります。1つのアイテムを開くと、同じグループの他のアイテムが自動的に閉じます。
Q1. HTMLとは何ですか?▼
HyperText Markup Language の略で、Webページの構造を定義するマークアップ言語です。見出し・段落・リンク・画像などの要素をタグで表現します。
Q2. CSSとは何ですか?▼
Cascading Style Sheets の略で、HTML要素の見た目(色・サイズ・レイアウトなど)を定義するスタイルシート言語です。HTMLから見た目の定義を分離できます。
Q3. JavaScriptとは何ですか?▼
Webページに動的な動作を追加するプログラミング言語です。ユーザー操作への反応、サーバーとの通信、DOM操作など幅広い処理を担います。
Q4. details name 属性はいつ使えますか?▼
Chrome 120・Firefox 130・Safari 17.2 以降で利用できます。JSなしで排他的アコーディオンが実現できるため、FAQやサイドバーのナビゲーションに最適です。
すべての <details> に同じ name="faq-basic" を指定しています。1つ開くと他が自動的に閉じます。
デモ2:CSSアニメーションあり(グリッドトリック)
コンテンツ部分を display: grid のラッパーで包み、grid-template-rows: 0fr → 1frをトランジションさせることで、スムーズな開閉アニメーションを実現します。
Q1. HTMLとは何ですか?▼
HyperText Markup Language の略で、Webページの構造を定義するマークアップ言語です。見出し・段落・リンク・画像などの要素をタグで表現します。
Q2. CSSとは何ですか?▼
Cascading Style Sheets の略で、HTML要素の見た目(色・サイズ・レイアウトなど)を定義するスタイルシート言語です。HTMLから見た目の定義を分離できます。
Q3. JavaScriptとは何ですか?▼
Webページに動的な動作を追加するプログラミング言語です。ユーザー操作への反応、サーバーとの通信、DOM操作など幅広い処理を担います。
Q4. details name 属性はいつ使えますか?▼
Chrome 120・Firefox 130・Safari 17.2 以降で利用できます。JSなしで排他的アコーディオンが実現できるため、FAQやサイドバーのナビゲーションに最適です。
グリッドトリック(grid-template-rows: 0fr → 1fr)でスムーズな開閉アニメーションを実現しています。<details> 要素と height: auto の間接的な制御が不要で、純粋なCSSのみで動作します。
HTML
html
<!-- ✅ name 属性でグループ化 → 排他制御(JSなし) -->
<details name="faq" open>
<summary>Q1. HTMLとは何ですか?</summary>
<p>HyperText Markup Language の略で、Webページの構造を定義する言語です。</p>
</details>
<details name="faq">
<summary>Q2. CSSとは何ですか?</summary>
<p>Cascading Style Sheets の略で、Webページの見た目を定義する言語です。</p>
</details>
<details name="faq">
<summary>Q3. JavaScriptとは何ですか?</summary>
<p>Webページに動的な動作を追加するプログラミング言語です。</p>
</details>
<!-- name 属性なし → 独立して開閉(従来の挙動) -->
<details>
<summary>独立したアコーディオン</summary>
<p>他の details の開閉に影響しません。</p>
</details>CSS(アニメーション)
css
/* ✅ グリッドトリックでスムーズな開閉アニメーション */
details > .content {
display: grid;
grid-template-rows: 0fr;
transition: grid-template-rows 0.3s ease;
overflow: hidden;
}
details[open] > .content {
grid-template-rows: 1fr;
}
.content > div {
min-height: 0; /* グリッドトリックに必要 */
padding: 12px 16px;
}
/* ✅ summary のスタイリング */
summary {
cursor: pointer;
list-style: none; /* デフォルトの三角を非表示 */
padding: 12px 16px;
display: flex;
justify-content: space-between;
align-items: center;
}
summary::after {
content: '▼';
transition: transform 0.3s ease;
}
details[open] > summary::after {
transform: rotate(-180deg);
}比較:name ありと name なし
| 観点 | <details name="group"> | <details>(name なし) |
|---|---|---|
| 排他制御 | ✅ 1つだけ開く | ❌ 複数同時に開ける |
| JavaScript | ✅ 不要 | ✅ 不要(独立開閉) |
| ブラウザ対応 | ⚠️ Chrome 120+ / Firefox 130+ / Safari 17.2+ | ✅ 全ブラウザ |
| 用途 | FAQ・排他的なナビゲーション | 独立した開閉パネル |
ライブラリを使ったアコーディオンの実装
高度なアニメーション・アクセシビリティ・キーボード操作が必要な場合はUIライブラリのアコーディオンコンポーネントが便利です。
🤖 AIプロンプトテンプレート
以下の要件を満たすHTMLとCSSを作成してください。 - <details> 要素の name 属性を使い、JSなしで排他的アコーディオンを実装する - 同じ name を持つ <details> グループ内では、1つだけが open 状態になる - <summary> 要素でヘッダーをスタイリングし、開閉状態に応じてアイコンを回転させる - グリッドトリック(grid-template-rows: 0fr → 1fr)でスムーズな開閉アニメーションを実装する - コンテンツ部分を <div class="content"><div>内容</div></div> でラップしてグリッドトリックを適用する - コメントは日本語で記述する
⚠️ このプロンプトはあくまでたたき台です。AIの回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。