アコーディオン
アコーディオンは、展開/折りたたんで詳細情報を表示できる、上位レベルのオプションのリストを表示します。
インストール
npx nextui-cli@latest add accordion
上記のコマンドは個別のインストール専用です。もし、 @nextui-org/react
がグローバルにインストール済みの場合は、この手順をスキップできます。
インポート
NextUIは、アコーディオン関連の2つのコンポーネントをエクスポートします。
- Accordion: アコーディオンアイテムのリストを表示するためのメインコンポーネントです。
- AccordionItem: 単一のアコーディオンアイテムを表示するためのアイテムコンポーネントです。
使い方
サブタイトル付き
複数アイテムの展開
selectionMode
を multiple
に設定すると、Accordion
は複数のアイテムを同時に展開できるようになります。
コンパクト
isCompact
を true
に設定すると、Accordion
はコンパクトなスタイルで表示されます。
バリアント
アコーディオンには、light
, shadow
, bordered
, splitted
の4つのバリアントがあります。
ライトバリアント
シャドウバリアント
ボーダー付きバリアント
分割バリアント
デフォルトで展開されるキー
デフォルトでいくつかのアイテムを展開したい場合は、defaultExpandedKeys
プロパティにキーの配列を設定できます。
無効化されたキー
いくつかのアイテムを無効化したい場合は、disabledKeys
プロパティにキーの配列を設定できます。
開始コンテンツ
アコーディオンアイテムの前にコンテンツを表示したい場合は、startContent
プロパティを設定できます。
カスタムインジケーター
アコーディオンアイテムには、indicator
というプロパティがあります。これを使用して、開閉インジケーターをカスタマイズできます。
インジケーターは、function
であることもでき、その場合、isOpen
、isDisabled
、そしてデフォルトのindicator
がパラメータとして渡されます。
カスタムモーション
アコーディオンは、enter
/ exit
アニメーションをカスタマイズするためのmotionProps
プロパティを提供します。
Framer motionのバリアントについて詳しくは、こちらをご覧ください。
制御されたコンポーネント
アコーディオンは制御されたコンポーネントであり、selectedKeys
プロパティを自分で制御する必要があります。
アコーディオンアイテムのスロット
- base: アコーディオンアイテムのラッパー。
- heading: アコーディオンアイテムの見出し。
indicator
とtitle
を含みます。 - trigger: アコーディオンアイテムを開閉するボタン。
- titleWrapper:
title
とsubtitle
のラッパー。 - title: アコーディオンアイテムのタイトル。
- subtitle: アコーディオンアイテムのサブタイトル。
- startContent: アコーディオンアイテムの前のコンテンツ。
- indicator: アコーディオンアイテムの開閉状態を示す要素。
- content: アコーディオンアイテムのコンテンツ。
カスタムアコーディオンスタイル
次のプロパティのいずれかを使用して、アコーディオンとアコーディオンアイテムのスタイルをカスタマイズできます。
className
: アコーディオンのクラス名。アコーディオンラッパーのスタイルを変更します。(Accordion)itemClasses
: アコーディオンアイテムのクラス名。すべてのアコーディオンアイテムのスタイルを一度に変更します。(Accordion)classNames
: アコーディオンアイテムのクラス名。各アコーディオンアイテムのスタイルを個別に変更します。(AccordionItem)
アコーディオンのスタイルをカスタマイズする方法の例を次に示します。
データ属性
AccordionItem
のbase
要素には、次の属性があります。
- data-open: アコーディオンアイテムが開いているかどうか。
- data-disabled: アコーディオンアイテムが無効になっている場合。
- data-hover: アコーディオンアイテムがホバーされている場合。useHoverに基づきます。
- data-focus: アコーディオンアイテムがフォーカスされている場合。useFocusRingに基づきます。
- data-focus-visible: アコーディオンアイテムがキーボードでフォーカスされている場合。useFocusRingに基づきます。
- data-disabled: アコーディオンアイテムが無効になっている場合。
isDisabled
プロパティに基づきます。 - data-pressed: アコーディオンアイテムが押されている場合。usePressに基づきます。
アクセシビリティ
- Space、Enter、Arrow Up、Arrow Down、Home / Endキーのキーボードイベントをサポートします。
- キーボードフォーカスの管理とクロスブラウザの正規化。
- アコーディオンアイテムの
aria-expanded
属性。 - アコーディオンアイテムの
aria-disabled
属性。 - アコーディオンアイテムの
aria-controls
属性。
API
アコーディオンの Props
属性 | 型 | 説明 | デフォルト |
---|---|---|---|
children | ReactNode | ReactNode[] | コレクションの内容。通常はAccordionItem の配列。 | |
variant | light | shadow | bordered | splitted | アコーディオンの外観スタイル。 | light |
selectionMode | none | single | multiple | コレクションで許可される選択の種類。 | |
selectionBehavior | toggle | replace | アコーディオンの選択動作。 | toggle |
isCompact | boolean | すべてのアコーディオンアイテムを小さくするかどうか。 | false |
isDisabled | boolean | アコーディオンアイテムを無効にするかどうか。 | |
showDivider | boolean | 各アコーディオンアイテムの下部に区切り線を表示するかどうか。 | true |
dividerProps | DividerProps | 区切り線コンポーネントのprops。 | - |
hideIndicator | boolean | アコーディオンアイテムのインジケーターを非表示にするかどうか。 | |
disableAnimation | boolean | アコーディオンアイテムの開閉アニメーションを無効にするかどうか。 | |
disableIndicatorAnimation | boolean | アコーディオンアイテムのインジケーターアニメーションを無効にするかどうか。 | |
disallowEmptySelection | boolean | コレクションで空の選択を許可するかどうか。 | |
keepContentMounted | boolean | アコーディオンアイテムのコンテンツを常にマウントしておくかどうか。 | false |
fullWidth | boolean | アコーディオンを親コンテナの全幅にするかどうか。 | true |
motionProps | MotionProps | アコーディオンのモーションプロパティ。 | |
disabledKeys | React.Key[] | 無効になっているアイテムのキー。これらのアイテムは選択、フォーカス、またはその他の操作を行うことはできません。 | |
itemClasses | Classnames | アコーディオンアイテムのclassNames。 | |
selectedKeys | all | React.Key[] | コレクション内で現在選択されているキー (制御付き)。 | |
defaultSelectedKeys | all | React.Key[] | コレクション内で最初に選択されているキー (非制御)。 | |
disabledKeys | React.Key[] | コレクション内で現在無効になっているキー (制御付き)。 |
アコーディオンのイベント
属性 | 型 | 説明 |
---|---|---|
onSelectionChange | (keys: "all" | Set<React.Key>) => any | 選択が変更されたときに呼び出されるハンドラー。 |
アコーディオンアイテムのProps
属性 | 型 | 説明 | デフォルト |
---|---|---|---|
children | ReactNode | string | コンポーネントの内容。 | |
title | ReactNode | string | アコーディオンアイテムのタイトル。 | |
subtitle | ReactNode | string | アコーディオンアイテムのサブタイトル。 | |
indicator | IndicatorProps | アコーディオンアイテムのexpanded インジケーター。通常は矢印アイコン。 | |
startContent | ReactNode | アコーディオンアイテムの開始コンテンツ。通常はアイコンまたはアバター。 | |
motionProps | MotionProps | framer motionアニメーションを修正するためのプロパティ。variants APIを使用して独自のアニメーションを作成します。 | |
isCompact | boolean | AccordionItemがコンパクトかどうか。 | false |
isDisabled | boolean | 現在の無効状態。 | false |
keepContentMounted | boolean | AccordionItemのコンテンツを閉じるときにマウントしておくかどうか。 | false |
hideIndicator | boolean | AccordionItemのインジケーターを非表示にするかどうか。 | false |
disableAnimation | boolean | AccordionItemのアニメーションを無効にするかどうか。 | false |
disableIndicatorAnimation | boolean | AccordionItemのインジケーターアニメーションを無効にするかどうか。 | false |
HeadingComponent | React.ElementType | Webアクセシビリティのためのカスタマイズ可能な見出しタグ。見出しを使用してコンテンツを説明し、一貫性があり、セマンティックに使用します。 | h2 |
classNames | Classnames | アコーディオンアイテムのスロットにカスタムクラス名を設定できます。 | - |
アコーディオンアイテムのイベント
属性 | 型 | 説明 |
---|---|---|
onFocus | (e: FocusEvent) => void | 要素がフォーカスを受け取ったときに呼び出されるハンドラー。 |
onBlur | (e: FocusEvent) => void | 要素がフォーカスを失ったときに呼び出されるハンドラー。 |
onFocusChange | (isFocused: boolean) => void | 要素のフォーカス状態が変化したときに呼び出されるハンドラー。 |
onKeyDown | (e: KeyboardEvent) => void | キーが押されたときに呼び出されるハンドラー。 |
onKeyUp | (e: KeyboardEvent) => void | キーが離されたときに呼び出されるハンドラー。 |
onPress | (e: PressEvent) => void | プレスがターゲット上でリリースされたときに呼び出されるハンドラー。 |
onPressStart | (e: PressEvent) => void | プレスインタラクションが開始されたときに呼び出されるハンドラー。 |
onPressEnd | (e: PressEvent) => void | プレスインタラクションがターゲット上で終了したとき、またはポインターがターゲットを離れたときに呼び出されるハンドラー。 |
onPressChange | (isPressed: boolean) => void | プレス状態が変化したときに呼び出されるハンドラー。 |
onPressUp | (e: PressEvent) => void | プレスがターゲット上でリリースされたときに呼び出されるハンドラー。ターゲットで開始されたかどうかは関係ありません。 |
onClick | MouseEventHandler | ネイティブボタンのクリックイベントハンドラー(非推奨)代わりにonPressを使用してください。 |
型
アコーディオンアイテムのインジケーターProps
export type AccordionItemIndicatorProps = {/*** The current indicator, usually an arrow icon.*/indicator?: ReactNode;/*** The current open status.*/isOpen?: boolean;/*** The current disabled status.* @default false*/isDisabled?: boolean;};type indicator?: ReactNode | ((props: AccordionItemIndicatorProps) => ReactNode) | null;
アコーディオンアイテムのclassNames
export type AccordionItemClassnames = {base?: string;heading?: string;trigger?: string;titleWrapper?: string;title?: string;subtitle?: string;startContent?: string;indicator?: string;content?: string;};
モーションProps
export type MotionProps = {/*** If `true`, the opacity of the content will be animated* @default true*/animateOpacity?: boolean;/*** The height you want the content in its collapsed state.* @default 0*/startingHeight?: number;/*** The height you want the content in its expanded state.* @default "auto"*/endingHeight?: number | string;/*** The y-axis offset you want the content in its collapsed state.* @default 10*/startingY?: number;/*** The y-axis offset you want the content in its expanded state.* @default 0*/endingY?: number;} & HTMLMotionProps;