Result
detailsタグを使った開閉コンテンツのスタイリングサンプル集です。
JSは開閉時のアニメーションに使用されているので、無くても開閉やアイコンのアニメーションに影響はありません。
css
[data-css- icon ] { --animdur: . 3 s; --loading-animdur: 0.8 s; --animtf: ease-in; --bdw: 2px ; --bdrs: 50% ; --bgc: transparent ; --c: currentcolor; --dots-bgc: silver ; --dots- size : 0.5 rem; --icon- size : 1 rem; -- size : 2.5 rem; align-items : center ; cursor : pointer ; display : flex ; justify-content : space-between; } [data-css- icon ] i { align-items : center ; background-color : var(--bgc); border-radius : var(--bdrs); box-sizing : border-box ; display : inline- flex ; height : var(--size); justify-content : center ; position : relative ; transition : background-color var(--animdur) var(--animtf); width : var(--size); } [data-css- icon ] i::after, [data-css- icon ] i::before { transform-origin : 50% 50% ; transition : all var(--animdur) var(--animtf); } [data-css- icon *= "down" ] i::after, [data-css- icon *= "right" ] i::after { background : transparent ; border-color : var(--c); border-style : solid ; box-sizing : border-box ; content : '' ; display : inline-block ; height : var(--icon-size) ; margin : 0 ; position : relative ; width : var(--icon-size); } [data-css- icon *= "down" ] i::after { border-width : 0 var(--bdw) var(--bdw) 0 ; top : calc( 0px - (var(--icon-size) / 4 )); transform : rotate ( 45 deg); } [data-css- icon *= "right" ] i::after { border-width : var(--bdw) var(--bdw) 0 0 ; right : calc((var(--icon-size) / 4 )); top : 0 ; transform : rotate ( 45 deg); } |
アイコンはCSSで作られていますので画像不要となっています。
基本的な部分はCSS変数で定義します。開閉コンテンツには予めカスタムデータ属性を付与した要素を含めてあり、その要素にアイコンも含められています。
html
< details > < summary > < span data-css-icon = "down" >Down To Up< i ></ i ></ span > </ summary > < div >Lorem ipsum dolor sit, amet consectetur adipisicing elit. Eos minus quo ipsam culpa! Dicta, reiciendis. </ div > </ details > |
1つのスタイルに絞ればかなり少ないコードで実装出来ますね。