Result
以前「CSSでフォルダツリーを作る」を書きましたが今回は開閉するタイプです。
お察しの通りですがdetails
タグで実装されています。
css
.tree { --spacing: 1.5 rem; --radius: 10px ; } .tree li { display : block ; position : relative ; padding-left : calc( 2 * var(--spacing) - var(--radius) - 2px ); } .tree ul { margin-left : calc(var(--radius) - var(--spacing)); padding-left : 0 ; } .tree ul li { border-left : 2px solid #ddd ; } .tree ul li:last-child { border-color : transparent ; } .tree ul li::before { content : "" ; display : block ; position : absolute ; top : calc(var(--spacing) / -2 ); left : -2px ; width : calc(var(--spacing) + 2px ); height : calc(var(--spacing) + 1px ); border : solid #ddd ; border-width : 0 0 2px 2px ; } .tree summary { display : block ; cursor : pointer ; } .tree summary:: marker , .tree summary::-webkit-details- marker { display : none ; } .tree summary:focus { outline : none ; } .tree summary:focus- visible { outline : 1px dotted #000 ; } .tree li::after, .tree summary::before { content : "" ; display : block ; position : absolute ; top : calc(var(--spacing) / 2 - var(--radius)); left : calc(var(--spacing) - var(--radius) - 1px ); width : calc( 2 * var(--radius)); height : calc( 2 * var(--radius)); border-radius : 50% ; background : #ddd ; } .tree summary::before { content : "+" ; z-index : 1 ; background : #696 ; color : #fff ; line-height : calc( 2 * var(--radius) - 2px ); text-align : center ; } .tree details[open] > summary::before { content : "−" ; } |
調整が必要ですがネストが深くなっても動作しました。
html
< ul class = "tree" > < li > < details open> < summary >Giant planets</ summary > < ul > < li > < details > < summary >Gas giants</ summary > < ul > < li >Jupiter</ li > < li >Saturn</ li > </ ul > </ details > </ li > < li > < details > < summary >Ice giants</ summary > < ul > < li >Uranus</ li > < li >Neptune</ li > </ ul > </ details > </ li > </ ul > </ details > </ li > </ ul > |
classは親のみ。
via
詳しい解説は以下をご参照下さい。
Tree views in css