JINMUSOFTWARE

details タグの使い方【HTML】

アコーディオン

details タグとは?

details タグを使用すると簡単に開閉メニューを作成できます。

HTMLだけで折りたたみ可能な仕組みを提供してくれます。

アコーディオンメニューとも呼ばれるようです。

以下のサンプルのヘッダー部分をクリックしてみてください。開閉します。

sample
人気のプログラミング言語2023
  1. JavaScript
  2. Python
  3. Java
  4. PHP

コードのサンプルです。

<details class="love-language" open>
 <summary class="summary">人気のプログラミング言語2023</summary>
 <ol>
  <li>JavaScript</li>
  <li>Python</li>
  <li>Java</li>
  <li>PHP</li>
 </ol>
</details>

details タグの簡単な使い方

  • details タグの中に「summaryタグ」と「本文」を置きます。
  • details タグの最初の子要素がsummaryタグであること。
  • summaryタグにはラベルやタイトルなどを記述すると良いでしょう。
  • details タグにopen属性を付けると最初から開いた状態になります。デフォルトでは閉じています。

code例

<details>
  <summary>Sample</summary>
  <p>contents1</p>
  <p>contents2</p>
</details>

summaryタグの範囲をクリックすると内容を開閉します。

Sample

contents1

contents2

Firefox、Vivaldi、Safari、Chrome、Edge、で、想定通り動作することを確認しました。

補足

summaryタグを忘れるとsummary部分に”詳細”と表示されました。皆さんは忘れないでくださいね。

イベントの処理

details タグはtoggleイベントに対応しています。

***

Sampleです。

開きました!

<script>
  const tex = document.getElementById("target6");
  const elemen = document.getElementById("details11");
  elemen.addEventListener("toggle", event => {
    if (elemen.open) {
      tex.textContent = "Open!";
    } else {
      tex.textContent = "Close!";
    }
  });
</script>

details タグに”toggle”イベントの処理を割り当てています。

ボタンで開閉してみよう

JavaScriptからopen属性を変更します。これは真理値です。

element.open = true | false で開閉可能です。

Sample

ここはsampleです。

btn = document.getElementById('btn');
btn.addEventListener('click', () => {
  det = document.getElementById('det');
  if (det.open) {
    det.open = false;
  } else {
    det.open = true;
  }
}, false);

アイコンの変更

summaryタグはdisplay: list-itemが適用されています。通常であれば「▶」のアイコンが表示されていると思います。

それでは、アイコンを変更してみましょう。

「list-style-type」や「list-style-image」を変更してアイコンを変更します。

default

基本の表示です。開くとマーカーが回転します。

none

「list-style: none」を指定するとマーカーが消えます。

circle

「list-style-type: circle」に変更しました。小さい丸が表示されていますね。

“\1F44D”

「list-style-type: “\1F44D”;」のUnicodeを指定しています。サムズアップのアイコンです。

url(‘arrow2-16.png’)

「list-style-image: url(“arrow2-16.png”)」で矢印画像を指定。

block

summaryタグを「display: block」に変更。list-styleが無くなりアイコンが表示されません。

Firefox、Vivaldi、Chrome、Edge、で、動作確認できました。

こちらも学習しておいたほうが良きですね。list-style – mdn –

アイコン変更に未対応のブラウザ

Safariは未対応でした。(2023年1月)

対応している場合は以下のようにアイコンが変更されます。

details タグの中にあるsummaryタグのアイコンを変更した様子
アイコンを変更した様子

Safariなどのwebkitのブラウザでアイコンを変更する場合は、「CSS 擬似要素 ::-webkit-details-marker 」を使用します。

summary::-webkit-details-marker { display: none } を使用して「▶」を消した後、擬似要素でアイコンを表示すると良いでしょう。

アイコンの回転を考慮する

さて、先ほどの例ですと、開閉時にアイコンが回転していませんね。回転するようにしてみたいと思います。

開閉時にアイコンを回転させる場合は属性セレクタ”[open]”を使用します。

開いたときに違うアイコンを指定します。

ls-7

cssの属性セレクタ[open]を利用して、開閉時に合わせてアイコンを変更する

<div class="div12">
<details class="ls-7">
<summary>ls-7</summary>
<p>[open]セレクタを利用してアイコンを開閉で変更する</p>
</details>
</div>
.ls-7 {user-select:none;}
.ls-7 summary {list-style-image: url("arrow2-16.png");}
.ls-7[open]>summary {list-style-image: url("arrow2-16-bottom.png");}
.ls-7[open]>summary::after { content: "(open)";}

擬似要素でアイコンを実装した場合は、transform: rotate(90deg) でも良きですね。

details タグと一緒に使えるおすすめのCSS

あったほうが良きかなと思いました。

  • cursor: pointer:summaryのhoverで、マウスカーソルをポインターに変更する。ユーザーがクリックできることに気づきやすくなるかな。
  • user-select:none:文字列の選択を禁止する。少し早めにクリックすると選択してしまうのが嫌だったので。

ただの補足

summaryタグを書かなかった場合の動作

  • そもそもsummaryタグを忘れることは無いとは思いますが。
  • detailsタグにsummaryタグを書かなかったとき、「詳細」と表示されました。
  • このとき、自動でsummaryタグが生成されているわけではないようです。tbodyとは違うようですね。
  • 昔のことですが、summaryタグが無いとき、ブラウザによってsummaryのクリック範囲が異なりました。safari系だと「▶」アイコン部分しかクリック範囲がありませんでした。
  • HTML、CSSはどんどん進化しているだなと感じました。
  • ちなみにW3CのValidateでエラーになります。
  • Markup Validation Service

内部的にはshadowDOMとslotが使用されているようだ

  • 開発者ツールの設定の「ユーザーエージェント シャドウDOMを表示」をONしておきます。
  • 開発者ツールでdetails部分を確認すると、shadowDOMが確認できます。
details タグ中のshadow-dom
detailsタグ中のshadow-dom

その他

  • CSSの制御で開閉はできない。CSSからは属性は変更できない。