Details
このページは現在調整中です
Lism UI (@lism-css/ui) はまだ準備中です。
クリックでコンテンツを開閉できるアコーディオンUIをdetails/summary要素で作成できるUIコンポーネントです。
Accordionとは違い、jsを使わずCSSだけでの実装となっています。
↓
Preview
Details Title
ここにコンテンツが入ります。
<Details.Root bd> <Details.Summary p='20' bgc='base-2' hov='neutral'> <Details.Title>Details Title</Details.Title> <Details.Icon /> </Details.Summary> <Details.Content p='20'> <p>ここにコンテンツが入ります。</p> </Details.Content></Details.Root>How to use
@lism-css/ui パッケージでDetails(.c--details)として提供しています。
Import
import { Details } from '@lism-css/ui/react'; 以下のコンポーネントが利用できます。
<Details.Root><Details.Summary><Details.Title><Details.Icon><Details.Content>
基本構造
<Details.Root> <Details.Summary> <Details.Title>Details Title</Details.Title> <Details.Icon/> </Details.Summary> <Details.Content> ...Contents... </Details.Content></Details.Root>Props
| プロパティ | 説明 |
|---|---|
<Details.Root> --duration | 展開アニメーションの秒数 |
<Details.Title> as | summary要素内のタイトルを出力するHTMLタグの種類 |
ソースコード
実際のソースコードは以下の通りです。
Details.jsx
/**
* React版 Detailsコンポーネント
*/
import getLismProps from 'lism-css/lib/getLismProps';
import { Lism } from 'lism-css/react';
import { getDetailsProps, defaultProps } from '../getProps';
// スタイルのインポート
import '../_style.css';
/**
* Details - ルートコンポーネント
* details要素をレンダリング
*/
export function Details({ children, ...props }) {
const lismProps = getLismProps(getDetailsProps(props));
return <details {...lismProps}>{children}</details>;
}
/**
* Summary - サマリーコンポーネント
* details要素のsummary部分
*/
export function Summary({ children, ...props }) {
return (
<Lism as='summary' {...defaultProps.summary} {...props}>
{children}
</Lism>
);
}
/**
* Title - タイトルコンポーネント
*/
export function Title({ children, ...props }) {
return (
<Lism {...defaultProps.title} {...props}>
{children}
</Lism>
);
}
/**
* Icon - アイコンコンポーネント
*/
export function Icon({ children, ...props }) {
return (
<Lism {...defaultProps.icon} {...props}>
{children}
</Lism>
);
}
/**
* Content - コンテンツコンポーネント
*/
export function Content({ children, ...props }) {
return (
<Lism {...defaultProps.body}>
<Lism {...defaultProps.content} {...props}>
{children}
</Lism>
</Lism>
);
} Examples
タイトルのHTMLタグを変更し、複数同時展開を制限する例
<Details.Title>はデフォルトではspanタグで出力されますが、asでHTMLタグを指定できます。
また、details/summaryの基本的な機能として、name属性を指定すると同じグループ内で同時に展開可能な要素が一つのみとなります。
↓
例
Details Title
ここにコンテンツが入ります。
Details Title
ここにコンテンツが入ります。
<Stack g='10'> <Details.Root bd name="details-group-01"> <Details.Summary p='20' bgc='base-2' hov='neutral'> <Details.Title as='h3'>Details Title</Details.Title> <Details.Icon /> </Details.Summary> <Details.Content p='20'> <p>ここにコンテンツが入ります。</p> </Details.Content> </Details.Root> <Details.Root bd name="details-group-01"> <Details.Summary p='20' bgc='base-2' hov='neutral'> <Details.Title as='h3'>Details Title</Details.Title> <Details.Icon /> </Details.Summary> <Details.Content p='20'> <p>ここにコンテンツが入ります。</p> </Details.Content> </Details.Root></Stack>summary内の見出し要素について
「summary内に見出し要素を配置しても、スクリーンリーダーでロール検出ができない」という問題がありましたが、2026年現在、すでにモダンブラウザではほとんど解決しているようです。
アニメーション時間を変更する例
<Details>の開閉アニメーションの時間は--duration変数で管理しており、初期値は、<Accordion>と同じ--acc-durationになっています。
局所的な調整には --duration変数を調整し、全体的な調整には:rootで--acc-durationを上書きしてください。
↓
例
Details Title
ここにコンテンツが入ります。
<Details.Root bd style={{'--duration': '.4s'}}> <Details.Summary p='20' bgc='base-2' hov='neutral'> <Details.Title as='h3'>Details Title</Details.Title> <Details.Icon /> </Details.Summary> <Details.Content p='20'> <p>ここにコンテンツが入ります。</p> </Details.Content></Details.Root>