details タグの使い方【HTML】
目次
details タグとは?
details タグを使用すると簡単に開閉メニューを作成できます。
HTMLだけで折りたたみ可能な仕組みを提供してくれます。
アコーディオンメニューとも呼ばれるようです。
以下のサンプルのヘッダー部分をクリックしてみてください。開閉します。
人気のプログラミング言語2023
- JavaScript
- Python
- Java
- 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月)
対応している場合は以下のようにアイコンが変更されます。
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が確認できます。
その他
- CSSの制御で開閉はできない。CSSからは属性は変更できない。