HTMLの details summary タグで簡単にアコーディオンを作る方法:JS不要!

折りたたみメニュー(アコーディオンやエクスパンド)を実装するには、JavaScriptを用いたり複雑なCSS指定が必要でした。しかし、HTML5で追加された<details>と<summary>を使えば、驚くほど簡単にできちゃいます!これのおかげで、コーディングの手間が減り、ページの表示速度も向上します。今回は、その実装方法をわかりやすく解説します。

目次expand_more

<details> と <summary> タグのメリットとデメリット

<details> と <summary> タグのメリット

シンプルで軽量な実装

HTMLだけで簡単に折りたたみメニューを実装できます。JavaScriptや複雑なCSSを使う必要がなく、コードがシンプルになるため、ページの読み込みも速くなります。これにより、ユーザーの操作がスムーズになり、ストレスのない体験を提供できます。

SEOに優しい

隠れた内容も検索エンジンに認識されやすいので、SEO対策として有効です。従来のJavaScriptによる折りたたみと異なり、重要な情報がクローラーに見逃される心配が少なく、SEO向上に貢献する可能性があります。

アクセシビリティ対応

キーボード操作やスクリーンリーダーでの利用が容易で、アクセシビリティに優れています。従来ではできなかった隠れた要素をページ内検索することも可能です。

視覚や操作に制限があるユーザーにも対応でき、幅広いユーザーにとって使いやすいコンテンツを提供できます。

<details> と <summary> タグのデメリット

HTMLとCSSだけでは限定的なアニメーションしかできません😭
ユニークな動きを実装するにはどうしてもJavaScriptが必要になってしまいます。

限定的なアニメーションですが、その方法も紹介しています。

CSSだけでアニメーションする方法ができました!

詳しくはこちらをご覧ください。
👉️ details要素をCSSだけでアニメーションできるようになった。

早速HTMLタグのみでアコーディオンメニュー(エクスパンド)を作ってみよう!

まずは簡単にHTMLのみで実装してみましょう!

最もシンプルな実装方法

シンプルなHTMLコード

<details>
  <summary>アコーディオンメニューとは</summary>
  エクスパンドとも呼ばれるアコーディオンメニューとはクリックやタップで項目を開閉できる折りたたみ式のメニューのことです。表示エリアをコンパクトに保ちながら、必要な情報を簡単に見せることができるため、FAQページやサイドメニューなどでよく使われます。
</details>

デフォルトのプレビュー

アコーディオンメニューとは エクスパンドとも呼ばれるアコーディオンメニューとはクリックやタップで項目を開閉できる折りたたみ式のメニューのことです。表示エリアをコンパクトに保ちながら、必要な情報を簡単に見せることができるため、FAQページやサイドメニューなどでよく使われます。

上記をクリックしてみてください!

「アコーディオンメニューとは」の左側に表示されている「►」はデフォルトで実装されているもので、CSSで変更することが可能です。次の章からカスタマイズしてみましょう!

左側の三角形を変更する

HTMLコードは先ほどのままで、CSSを追加しましょう。ついでに色々足します!

  • 「►」を「👉(絵文字)」に変更
  • クリックできることがわかるようにカーソルを指マークに
  • borderを追加

CSSを追加して左側の►を変更

details {
  border: 1px solid #333;
  padding: 1em;
}
details summary {
  cursor: pointer;
  list-style-type: "👉";
}
details[open] > summary {
  list-style-type: "👇";
  margin-bottom: 1em;
}

変更後のプレビュー

アコーディオンメニューとエクスパンドの違い エクスパンドは複数のセクションを同時に開くことができるのに対し、アコーディオンメニューは一つ開くと他が閉じる動作が特徴です。それぞれ、表示の仕方やユーザー体験が異なります。

画像を使ったり、icon font を使ったりすることも可能です!

デフォルトで開いた状態にする

最初から開いた状態にするには <details>open を追加します。簡単ですね!

また、open状態をCSSで制御したい場合は details[open] を使用します。前章のCSS追加でも使っています。

openを追加したHTMLタグ

<details open>
  <summary>最初から開いた状態</summary>
  テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
</details>

デフォルトで開いた状態のプレビュー

最初から開いた状態 テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト

1つを開いたらそれ以外は閉じる

name 属性を指定することにより、グループ化することができるようになりました!グループ化することにより、1つ開いたいらそれ以外は閉じる挙動が実装できます。

ただし、現在のところ対応していないブラウザもあります。(2025年1月現在)

対応しているブラウザ
Google Chrome
Safari
対応していないブラウザ
Firefox

グループ化したHTMLタグ

<details name="details_group" open>
  <summary>グループ</summary>
  テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
</details>
<details name="details_group">
  <summary>グループ</summary>
  テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
</details>
<details name="details_group">
  <summary>グループ</summary>
  テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
</details>

グループ化した(1つ開いたらそれ以外は閉じる)状態のプレビュー

グループ テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
グループ テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
グループ テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト

入れ子にしたり、他のタグを入れることも可能

色々なタグを入れてみたHTMLコード

<details open>
  <summary>アコーディオンメニューを入れ子構造にしてみよう</summary>
  <p>テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト</p>
  <ul>
    <li>リストも入れられる</li>
    <li>リストも入れられる</li>
    <li>リストも入れられる</li>
  </ul>
  <details>
    <summary>入れ子の子🐈</summary>
    テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
  </details>
  <details>
    <summary>入れ子の子🐕</summary>
    テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
  </details>
</details>

プレビュー

アコーディオンメニューを入れ子構造にしてみよう

テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト

  • リストも入れられる
  • リストも入れられる
  • リストも入れられる
入れ子の子🐈 テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト
入れ子の子🐕 テキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト

CSSでアニメーションを追加

とてつもなく限定的な範囲ですが、開閉のアニメーションをCSSのみで追加することができます。
ちなみにこの方法はブラウザのバグっぽいのでいつか効かなくなる可能性があります。

ちゃんとした実装方法は別記事で紹介しているのでそっちを見てね
👉️ details要素をCSSだけでアニメーションできるようになった。

<details>
  <summary>アコーディオンをCSSでアニメーションする💪</summary>
  アコーディオンをCSSでアニメーションしたい場合、summaryタグの直後はインライン要素の必要があります🥺そのため、ブロック要素である div, p, ul などは使用できないので注意が必要です。
  <p>ここから👇️はブロック要素です。直後がインライン要素であれば良いので、説明文はタグをつけずにその下はdivにするなどが可能です。</p>
</details>

アニメーションをCSSで追加

details {
  border: 1px solid #333;
  padding: 1em;
}
details summary {
  cursor: pointer;
  list-style-type: "👉";
  transition: ease .2s;
}
details[open] > summary {
  list-style-type: "👇";
  margin-bottom: 1em;
}

アニメーションを追加したプレビュー

アコーディオンをCSSでアニメーションする💪 アコーディオンをCSSでアニメーションしたい場合、summaryタグの直後はインライン要素の必要があります🥺そのため、ブロック要素である div, p, ul などは使用できないので注意が必要です。

ここから👇️はブロック要素です。直後がインライン要素であれば良いので、説明文はタグをつけずにその下はdivにするなどが可能です🌷

emoji_objects
  • </summary>のすぐ後は必ずインライン要素じゃないとアニメーションを実現できません。
  • <span>はOK。<p>、<div>、<ul>などはNGです!ブロック要素を挿入したい場合はJSが必要です。
  • details[open]のときの</summary>タグで変化する要素を追加しないといけません。今回の場合、margin-bottomを変化させているのでアニメーションしているように見えています。

HTML5で折りたたみ要素を簡単に実装できて便利になった🎵

この記事を書くにあたり、「目次」に適用してみたのですが、すぐに実装できてかなり簡単でした。JavaScriptに苦手意識があるのでかなり助かります。

ぜひ皆さんも使ってみてください!

0件のコメント

コメントはまだありません。最初の一人になりましょう!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です