本文へスキップ

ネイティブ開閉アニメ(details)

HTMLの<details>だけで、中身がふわっと高さアニメーションしながら開閉する。::details-contentとcalc-size()でJSなしのアコーディオン。

ENGLISH

Native Details Disclosure

  • CSSのみ
約46行動きと演出 / モダンCSS・プラットフォーム の一覧 →

プレビュー

クリック

操作クリック/タップで動きます。

仕様書

向く場面
  • FAQ・配送/返品などの折りたたみ説明
  • JS なしで高さアニメ付きの開閉
  • 初期状態で1つ開いておく一覧
避ける場面
  • 一度に1つだけ開かせたい制御(name 属性未使用)
  • 全ブラウザで同じ動きが必須の案件
構成要素
  • summary(見出し)
  • +記号
  • 本文
持っている状態
  • 通常
キーボード

Tab で各 summary へ、Enter/Space で開閉(ネイティブ details)

支援技術

ネイティブ details/summary なので役割と展開状態はブラウザが支援技術へ伝える。+記号は aria-hidden の装飾。未対応環境と reduced-motion では瞬時に開閉

動き

::details-content の height 0→auto と opacity を 300ms ease(interpolate-size: allow-keywords)。+が 45° 回転 300ms

デザインの要点

  • :root に interpolate-size: allow-keywords を置くと height: 0 → auto を補間できる。JS で scrollHeight を測る必要がない
  • transition に content-visibility 0.3s allow-discrete を含める。無いと閉じる瞬間に中身が先に消え、高さだけが縮む
  • 開閉 300ms・+の 45° 回転も同じ 300ms。時間を揃えると記号と本文が 1 つの動きに見える
  • summary に min-height 44px と list-style: none。既定の三角マーカーを消して+を右端に置き、行全体を押せる
実装メモ

HTML標準の<details>を、::details-content 疑似要素と calc-size()(interpolate-size: allow-keywords)で高さアニメーションさせる例です。JavaScriptによる高さ計測が不要になります。::details-content と height:auto へのトランジションは新しめのブラウザで有効で、未対応環境では<details>本来の「瞬時に開閉」へフォールバックするため機能は壊れません。

コード(コピーして使えます)

<div class="dd-wrap">
  <details class="dd" open>
    <summary>配送について<span class="dd-mark" aria-hidden="true">+</span></summary>
    <div class="dd-content">全国翌日配送に対応しています。離島・一部地域は2〜3日かかる場合があります。</div>
  </details>
  <details class="dd">
    <summary>返品・交換<span class="dd-mark" aria-hidden="true">+</span></summary>
    <div class="dd-content">お届けから14日以内であれば、未使用品に限り返品・交換を承ります。</div>
  </details>
  <details class="dd">
    <summary>支払い方法<span class="dd-mark" aria-hidden="true">+</span></summary>
    <div class="dd-content">クレジットカード・各種QR決済・コンビニ後払いに対応しています。</div>
  </details>
</div>

タグ

同じカテゴリ「モダンCSS・プラットフォーム」のほかのパーツ

関連パーツ