HTMLの<details>
タグと<summary>
タグを合わせて使えば、簡単にアコーディオンや折りたたみメニューを作ることができます。JavaScriptを使う必要はありません。
😺アコーディオンとは:折りたたまれたコンテンツのこと。クリックやタップにより、折りたたまれていた部分が開きます。
️<details>
と<summary>
は、HTML5から登場しました。ほとんどの主要ブラウザで使用できますが、IEには対応していません。
detailsとsummaryタグの使い方
<details>
と<summary>
を以下のように合わせて使うことで折りたたみコンテンツ(アコーディオン)を作成できます。
<details>
<summary>HTMLって何の略?</summary>
<p>「Hyper Text Markup Language」の略です。</p>
</details>
↑クリックすると開きます
- <details>
- アコーディオン全体を囲みます。
- <summary>
- アコーディオンのタイトル(常に見えているテキスト)を入れます。具体的には、要約やキャプションなどが入ると思います。
- <p>
- 詳細(クリックで開閉する、折りたたまれたコンテンツ)を入れます。段落(
<p>
)だけでなく、リスト(<ul>
・<ol>
)などの他の要素を使ってもOKです。
詳細には、複数の要素を配置できる
<details>
<summary>HTMLとは</summary>
<p>HTMLはマークアップ言語の1つです。</p>
<p>次のような特徴を持ちます。</p>
<ul>
<li>Webページを表現する</li>
<li>WHATWGにより仕様策定</li>
</ul>
</details>
👆<summary>
はアコーディオンのタイトルとなり、1つだけ配置します。
<details>
内のそれ以外の部分は、詳細(開閉する部分)となり、複数の要素を置くことができます。このサンプルのように、複数の段落やリストなどを入れてもOKです。
はじめからアコーディオンを開いておく
<details open>
<summary>open属性ありの場合</summary>
<div>詳細テキスト</div>
</details>
👆<details>
タグにopen
属性を指定すると、はじめからアコーディオンを開いておくことができます。<details open>
という形ですね。
JavaScriptで開閉を操作
JavaScriptによるopen
属性の操作により、開閉をコントロールできます。open
属性を取り除くと、アコーディオンは閉じます。逆にopen
属性を追加すると開きます。
開閉時にイベントを発火
アコーディオンの開閉をトリガーにイベントを発火させることもできます。
const detailsElem = document.getElementById("hoge");
detailsElem.addEventListener("toggle", function(event) {
if (detailsElem.open) {
/* 開いたときの処理 */
} else {
/* 閉じたときの処理 */
}
});
👆開閉はtoggle
イベントで拾い、開閉状態はdetails要素.open
で調べることができます。
CSSでアコーディオンをカスタマイズ
<details>
<summary>タイトル</summary>
<p>詳細コンテンツ</p>
</details>
👆<details>
と<summary>
で作ったアコーディオンは、デフォルトではこのように表示されます。タイトル(<summary>
)に付いてる三角形の矢印は自動で表示されます。
矢印を消す
<summary>
の矢印(▶)を消す方法は、ブラウザにより異なります。以下のCSSを指定すれば、各ブラウザで矢印を消すことができます。
/* Chrome、Safari以外 */
summary {
display: block;
}
/* Chrome、Safari */
summary::-webkit-details-marker {
display: none;
}
👆webkitブラウザ(Chrome、Safari)ではsummary::-webkit-details-marker
により矢印が表示されているため、こちらを非表示にします。それ以外のブラウザでは、<summary>
がdisplay: list-item
となることで矢印が表示されているため、display: block
で上書きすれば消すことができます。
矢印をカスタマイズする
矢印をカスタマイズしたいときは、デフォルトの矢印を消したうえで、疑似要素などを使ってアイコンや画像を表示させます。
疑似要素でアイコンを表示
👆<summary>
に対して疑似要素(:before
と:after
)を設定し、アイコンを表現しています。疑似要素により、Font AwesomeなどのWebアイコンフォントを表示させることもできます。
疑似要素で画像を表示
CSS
summary {
display: block; /* デフォルトの矢印を消す */
}
summary::-webkit-details-marker {
display: none; /* デフォルトの矢印を消す */
}
summary:before {
content: url("/example.png"); /* 画像URLを指定 */
}
👆矢印の代わりに画像を使いたい場合には、疑似要素のcontent
に画像URLを指定すれば良いかと思います。
ホバー時のスタイルを変える
デフォルトのスタイルでは、アコーディオンの上にマウスオーバーしたとき(ホバー時)の反応が直感的ではありません。
具体的には以下のようなCSSを指定します。
summary {
cursor: pointer;
transition: 0.2s; /* 変化を滑らかに */
}
/* ホバー時のスタイル */
summary:hover {
cursor: pointer; /* カーソルを指マークに */
background-color: #EFEFEF;
}
オープン時(開いている時)のスタイルを変える
details[open]
というセレクタにより、アコーディオンが開いているときのスタイルだけを変えることができます。
details[open] summary {
color: gray;
}
👆details[open] suumary
というセレクタにより「オープン時の<summary>
のスタイル」を変えています。アコーディオンを開いているときだけ、タイトルの文字色が灰色になります。
アニメーションでふわっと表示する
CSSのanimation
プロパティを使って、アコーディオンを開いたときに、ふわっと表示することもできます。
/* オープン時にアニメーションを設定 */
details[open] .details-content {
animation: fadeIn 0.5s ease;
}
@keyframes fadeIn {
0% {
opacity: 0; /* 透明 */
transform: translateY(-10px); /* 上から表示 */
}
100% {
opacity: 1;
transform: none;
}
}
👆HTMLでは、折りたたまれるコンテンツ全体を<div class="details-content">
の中に入れています。CSSでは、.details-content
に対して、アニメーションを設定しています。
✍️opacity
の値を0から1にすると「透明→不透明」となり、ふわっと感が出ます。またtransform
プロパティを使って、少し上から降りてくるようなエフェクトをかけています。
アウトラインを消す(非推奨)
<summary>
には、クリック時に青い線(アウトライン)が表示されることがあります。
アウトラインは以下のようにsummary { outline: none; }
で消すことができますが、アクセシビリティの観点から消すことはおすすめしません。
😿たとえば、マウスを使わずにキーボードで操作しているユーザーが、アコーディオンを見つけられないかもしれません。
summary {
cursor: pointer;
outline: none;
}
アコーディオンを装飾するサンプルCSS
ここまでの内容をふまえて、<details>
と<summary>
によるアコーディオンを装飾するサンプルCSSを紹介します。
<details>
と<summary>
を使えば、この他にも「ドロップダウンメニュー」や「ハンバーガーメニュー」などを作ることができます。HTMLとCSSだけで、簡単にアコーディオンや折りたたみメニューを設置できるのは嬉しいですね。
たとえば、ホバー時にはカーソルをポインター(指マーク)にして、背景色を変えると、よりアコーディオンであることが伝わりやすくなるでしょう。