ネストされたリストを折りたたみ/展開可能にする機能です。HTML5 の <details>/<summary> 要素を使用して、JavaScript により動的に変換されます。
.collapsible-list クラスなし) には影響しません。<details> 要素でラップされている項目は変換されません。展開可能なリストを示す汎用クラスです。
<div class="collapsible-list">
<ul>
<li>親項目1
<ul>
<li>子項目1-1</li>
<li>子項目1-2</li>
</ul></li>
<li>親項目2</li>
</ul>
</div>注意: このクラスは追加クラス (modifier class) として設計されています。既存のスタイルを上書きせず、展開機能のみを付与します。
\toc コマンドで生成される目次リストには、自動的に collapsible-list クラスが付与されます。
Markdown:
\toc depth=-1生成される HTML:
<div class="collapsible-list">
<ul>
<li>📁 <a href="index.html">トップレベル</a>
<ul>
<li>📄 <a href="file.html">ファイル</a></li>
</ul></li>
</ul>
</div>Pandoc の fenced div 記法を使用して、任意のリストに展開機能を付与できます。
::: {.collapsible-list}
- 親項目1
- 子項目1-1
- 子項目1-2
- 親項目2
- 子項目2-1
:::JavaScript により、子要素を持つ <li> 要素が以下のように変換されます。
変換前:
<li>親項目
<ul>
<li>子項目</li>
</ul></li>変換後:
<li>
<details>
<summary>親項目</summary>
<ul>
<li>子項目</li>
</ul>
</details>
</li>.collapsible-list {
/* 現時点ではデフォルトスタイルのみ */
}
.collapsible-list details > summary {
cursor: pointer;
list-style: none;
}
.collapsible-list details > summary::-webkit-details-marker {
display: none;
}展開/折りたたみ状態を示すマーカーは、CSS の ::before 疑似要素で実装されます。Windows 11 エクスプローラー風のシェブロン (>) を CSS の border プロパティで描画しています。
>∨.collapsible-list details > summary::before {
content: "";
display: inline-block;
width: 6px;
height: 6px;
border-right: 2px solid #000;
border-bottom: 2px solid #000;
transform: rotate(-45deg); /* 折りたたみ時: 右向き */
}
.collapsible-list details[open] > summary::before {
transform: rotate(45deg); /* 展開時: 下向き */
}展開マーカーを持つ項目 (子リストを持つ <li>) は、Bullet (・) が非表示になります。これは CSS の :has() セレクタにより実現されています。
JavaScript は以下の条件を満たす要素を変換します。
.collapsible-list クラスを持つ要素の子孫<li> 要素<ul> または <ol> を持つ折りたたみ/展開状態は sessionStorage を使用してブラウザの「戻る」操作時に復元されます。
sessionStorage のため)PerformanceNavigationTiming API を使用して、ナビゲーション種別 (back_forward) を判定します。sessionStorage のキーは collapsible-state:{pathname} の形式で、ページごとに状態を管理します。<details> 要素の toggle イベントを監視し、状態変更時に自動保存します。