テック技報最新号へ →
デザイン

アコーディオンはJSで作らず、HTMLの <details> と <summary> で開閉させ、矢印はCSSで付ける

<details> は標準で開閉とキーボード操作に対応する。name 属性を揃えると「1つ開くと他が閉じる」も書ける。

@wokobo_net · 投稿 2026-10-16
#HTML#CSS#アコーディオン#details#アクセシビリティ

どんな問題を解決するか / いつ使うか

FAQやメニューの開閉をJavaScriptで作り込むと、コードが増え、キーボード操作や読み上げへの対応も漏れやすい。AIに作らせるとJSで書きがちな部品。

やり方

html
<details class="faq" name="faq">
  <summary>送料はかかりますか?</summary>
  <p>5,000円以上で無料です。</p>
</details>
<details class="faq" name="faq">
  <summary>返品できますか?</summary>
  <p>到着後7日以内なら可能です。</p>
</details>
css
.faq summary {
  list-style: none;                /* 既定の三角を消す */
  cursor: pointer;
  display: flex; justify-content: space-between;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after {
  content: "";
  width: .6em; height: .6em;
  border-right: 2px solid; border-bottom: 2px solid;
  rotate: 45deg;
  transition: rotate .2s;
}
.faq[open] summary::after { rotate: -135deg; }
  • 同じ name を付けた <details> は、1つ開くと他が自動で閉じる(排他的アコーディオン)。

注意点

  • 開閉のなめらかなアニメーションまで付けたい場合は、::details-content や interpolate-size が使えるブラウザに限られる。付かなくても開閉自体は動く。
  • ルールファイルに「アコーディオンは details/summary、モーダルは dialog」と書いておくとAIが従いやすい(モーダルはJSで開閉を作り込まず、HTMLの <dialog> 要素を使う)。
  • コード例は一般的な書き方で補ったもの(元の投稿はテキストのみ)。

出典

  • 投稿者: @wokobo_net
  • 投稿: @wokobo_net · 2026-10-14
  • 収集日: 2026-10-16(JST、10/15・10/16分の巡回をまとめて実施)
X の元の投稿を開く