検索

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>

© Lism CSS. All rights reserved.