排他的アコーディオン(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の回答はモデルやバージョン、会話の文脈によって毎回異なります。意図通りに動かない場合は、条件を追記・修正してお使いください。