Accordion
アコーディオン要素を作成できるコンポーネントです。
details.d--accordion summary.d--accordion__header.l--flex.-ai:c span.d--accordion__label.-fx:1 ...Header label... span.d--accordion__icon.-d:if svg.l--icon div.d--accordion__body.l--grid div.d--accordion__inner.-ov:h ...Contents...
details/summary
を採用。grid
の1fr
を使ったトランジションで “height:100% がアニメーションできない問題” を解決。
Import
Section titled “Import”import { Accordion } from 'lism-css';
プロパティ | 説明 |
---|---|
<Accordion.Icon> icon | 内部で呼び出される<Icon> に渡す icon を指定できます。ただし、<Accordion.Icon> に子要素が配置されている場合は無視されます。 |
<Accordion.Icon> isTrigger | data-role="trigger" button タグでの出力となり[data-role="trigger"] が付与されます。 |
Accordion.Label
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi provident libero, eum nulla sunt, porro sed dicta. Impedit ullam eveniet obcaecati minima.
<Accordion.Root p='20'> <Accordion.Header> <Accordion.Label>Accordion.Label</Accordion.Label> <Accordion.Icon/> </Accordion.Header> <Accordion.Body mbs='20'> <Dummy length='l' /> </Accordion.Body></Accordion.Root>
Accordion.Label
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi provident libero, eum nulla sunt, porro sed dicta. Impedit ullam eveniet obcaecati minima.
<Accordion.Root p='20'> <Accordion.Header> <Accordion.Label tag='h3' f='inherit' fw='bold'>Accordion.Label</Accordion.Label> <Accordion.Icon/> </Accordion.Header> <Accordion.Body mbs='20'> <Dummy length='l' /> </Accordion.Body></Accordion.Root>
アイコンを変更する
Section titled “アイコンを変更する”<Accordion.Label>
に指定するicon
は、内部で<Icon>
に渡されます。
Accordion.Label
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi provident libero, eum nulla sunt, porro sed dicta. Impedit ullam eveniet obcaecati minima.
import { CaretDoubleDown } from "@phosphor-icons/react";
<Accordion.Root p='20'> <Accordion.Header> <Accordion.Label>Accordion.Label</Accordion.Label> <Accordion.Icon icon={CaretDoubleDown}/> </Accordion.Header> <Accordion.Body mbs='20'> <Dummy length='l' /> </Accordion.Body></Accordion.Root>
アコーディオンの同時開閉を禁止する
Section titled “アコーディオンの同時開閉を禁止する”複数の<Accordion.Root>
(.d--accordion
)を含む親要素に [data-accordion-multiple="disallow"]
を指定すると、複数のアコーディオンを同時に開くことを禁止し、どれかが開くとその兄弟アコーディオンを閉じるようになります。
Accordion.Label
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi provident libero, eum nulla sunt, porro sed dicta. Impedit ullam eveniet obcaecati minima.
Accordion.Label
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi provident libero, eum nulla sunt, porro sed dicta. Impedit ullam eveniet obcaecati minima.
Accordion.Label
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi provident libero, eum nulla sunt, porro sed dicta. Impedit ullam eveniet obcaecati minima.
<Stack g='1px' data-accordion-multiple='disallow'> <Accordion.Root> <Accordion.Header p='30' bgc='text' c='base'> <Accordion.Label>Accordion.Label</Accordion.Label> <Accordion.Icon/> </Accordion.Header> <Accordion.Body p='30'> <Dummy length='l' /> </Accordion.Body> </Accordion.Root> <Accordion.Root> <Accordion.Header p='30' bgc='text' c='base'> <Accordion.Label>Accordion.Label</Accordion.Label> <Accordion.Icon/> </Accordion.Header> <Accordion.Body p='30'> <Dummy length='l' /> </Accordion.Body> </Accordion.Root> ...</Stack>
開閉トランジションの時間を変更する
Section titled “開閉トランジションの時間を変更する”アコーディオン用のトランジションは--trsdu--acc
で秒数を管理できます。
親要素に変数をセットすると一括管理できます。
Accordion.Label
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi provident libero, eum nulla sunt, porro sed dicta. Impedit ullam eveniet obcaecati minima.
Accordion.Label
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi provident libero, eum nulla sunt, porro sed dicta. Impedit ullam eveniet obcaecati minima.
Accordion.Label
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi provident libero, eum nulla sunt, porro sed dicta. Impedit ullam eveniet obcaecati minima.
<Stack g='30' style={{'--trsdu--acc': '.2s'}}> <Accordion.Root bgc='base-2' bxsh='1' bdrs='3'> <Accordion.Header p='30'> <Accordion.Label>Accordion.Label</Accordion.Label> <Accordion.Icon/> </Accordion.Header> <Accordion.Body p='30' bd='t' bdc='divider'> <Dummy length='l' /> </Accordion.Body> </Accordion.Root> <Accordion.Root bgc='base-2' bxsh='1' bdrs='3'> <Accordion.Header p='30'> <Accordion.Label>Accordion.Label</Accordion.Label> <Accordion.Icon/> </Accordion.Header> <Accordion.Body p='30' bd='t' bdc='divider'> <Dummy length='l' /> </Accordion.Body> </Accordion.Root> ...</Stack>
CSSで:root
の--acc-duration
を上書きすると、デフォルトの開閉速度を変更できます。
Opt-in 機能
Section titled “Opt-in 機能”追加でCSSが必要な機能
開閉時のアイコンを分ける
Section titled “開閉時のアイコンを分ける”追加で少しCSSを加える必要がありますが、開閉時にアイコンを切り替える例も紹介します。
Accordion.Label
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi provident libero, eum nulla sunt, porro sed dicta. Impedit ullam eveniet obcaecati minima.
<Accordion.Root p='20'> <Accordion.Header> <Accordion.Label>Accordion.Label</Accordion.Label> <Accordion.Icon> <Icon icon={{as:Plus, weight:'bold'}} /> <Icon icon={{as:Minus, weight:'bold'}} /> </Accordion.Icon> </Accordion.Header> <Accordion.Body mbs='20'> <Dummy length='l' /> </Accordion.Body></Accordion.Root>
アコーディオントリガーをアイコンのみにする
Section titled “アコーディオントリガーをアイコンのみにする”<Accordion.Icon>
に isTrigger
を指定すると、button
タグでの出力となり[data-role="trigger"]
が付与されます。
この時、アコーディオンを開閉するためのclick
イベントは summary
(アコーディオンヘッダー)全体ではなくアイコン部分に対して登録されます。
これにより、アコーディオンヘッダー内部のテキストリンクをクリックできるようになり、さらに以下に示すような追加CSSを適用することで、アイコン部分だけをクリックできるように制限することもできます。
メニューリンク
Lorem ipsum dolor sit, amet consectetur adipisicing elit, sed do eiusmod tempor. Non facere laudantium ex eos doloribus aut dolore nisi.
<Accordion.Root p='20'> <Accordion.Header trigger='icon'> <Accordion.Label><a href="#acc-innerlink">メニューリンク</a></Accordion.Label> <Accordion.Icon isTrigger bd bdrs='1' bgc='inherit' p='10' /> </Accordion.Header> <Accordion.Body mbs='20'>...</Accordion.Body></Accordion.Root>
上記の追加CSSを適用しても、Tabキーでのカーソル操作時におけるsummary
タグ全体の選択を回避することはできません。
スクリプトの処理の内容について
Section titled “スクリプトの処理の内容について”おおまかな処理ステップは以下の通りです。
d--accordion
のsummary
要素、または(data-role="trigger"
があればその要素)にク対してリックイベント・トグルイベントを登録- クリック時、開閉状態に応じて、open属性と
.-opened
クラスを操作。- アニメーションの終了を待ってから状態を確定する。
- アコーディオンが開く時、親要素に
data-accordion-multiple="disallow"
があるかチェックし、あれば他の兄弟要素を閉じる。
- トグル時の処理
- open属性と
.-opened
クラスが食い違った場合に修正。
- open属性と
- イベント解除(コンポーネントのアンマウント時に登録イベントを解除。)