组件

手风琴

一组垂直堆叠的交互式标题,每个标题都显示关联的内容部分。

import * as React from "react";
import { Accordion } from "radix-ui";
import classNames from "classnames";
import { ChevronDownIcon } from "@radix-ui/react-icons";
import "./styles.css";
const AccordionDemo = () => (
<Accordion.Root className="AccordionRoot" type="single" defaultValue="item-1" collapsible >
<Accordion.Item className="AccordionItem" value="item-1">
<AccordionTrigger>Is it accessible?</AccordionTrigger>
<AccordionContent>
Yes. It adheres to the WAI-ARIA design pattern.
</AccordionContent>
</Accordion.Item>
<Accordion.Item className="AccordionItem" value="item-2">
<AccordionTrigger>Is it unstyled?</AccordionTrigger>
<AccordionContent>
Yes. It's unstyled by default, giving you freedom over the look and
feel.
</AccordionContent>
</Accordion.Item>
<Accordion.Item className="AccordionItem" value="item-3">
<AccordionTrigger>Can it be animated?</AccordionTrigger>
<Accordion.Content className="AccordionContent">
<div className="AccordionContentText">
Yes! You can animate the Accordion with CSS or JavaScript.
</div>
</Accordion.Content>
</Accordion.Item>
</Accordion.Root>
);
const AccordionTrigger = React.forwardRef(
({ children, className, ...props }, forwardedRef) => (
<Accordion.Header className="AccordionHeader">
<Accordion.Trigger className={classNames("AccordionTrigger", className)} {...props} ref={forwardedRef} >
{children}
<ChevronDownIcon className="AccordionChevron" aria-hidden />
</Accordion.Trigger>
</Accordion.Header>
),
);
const AccordionContent = React.forwardRef(
({ children, className, ...props }, forwardedRef) => (
<Accordion.Content className={classNames("AccordionContent", className)} {...props} ref={forwardedRef} >
<div className="AccordionContentText">{children}</div>
</Accordion.Content>
),
);
export default AccordionDemo;

功能

    完整的键盘导航。

    支持水平/垂直方向。

    支持从右到左的方向。

    可以展开一个或多个项目。

    可以是受控的或非受控的。

安装

从命令行安装组件。

npm install @radix-ui/react-accordion

结构

导入所有部分并将它们组装在一起。

import { Accordion } from "radix-ui";
export default () => (
<Accordion.Root>
<Accordion.Item>
<Accordion.Header>
<Accordion.Trigger />
</Accordion.Header>
<Accordion.Content />
</Accordion.Item>
</Accordion.Root>
);

API 参考

包含手风琴的所有部分。

属性类型默认值
asChild
boolean
false
type*
enum
无默认值
value
string
无默认值
defaultValue
string
无默认值
onValueChange
function
无默认值
value
string[]
[]
defaultValue
string[]
[]
onValueChange
function
无默认值
collapsible
boolean
false
disabled
boolean
false
dir
enum
"ltr"
orientation
enum
"vertical"
数据属性
[data-orientation]"vertical" |"horizontal"

Item

包含可折叠部分的所有部分。

属性类型默认值
asChild
boolean
false
disabled
boolean
false
value*
string
无默认值
数据属性
[data-state]"open" |"closed"
[data-disabled]

Present when disabled

[data-orientation]"vertical" |"horizontal"

包裹 ``。 使用 asChild 属性将其更新为页面上合适的标题级别。

属性类型默认值
asChild
boolean
false
数据属性
[data-state]"open" |"closed"
[data-disabled]

Present when disabled

[data-orientation]"vertical" |"horizontal"

触发器

切换其关联项的折叠状态。 它应该嵌套在 `` 内部。

属性类型默认值
asChild
boolean
false
数据属性
[data-state]"open" |"closed"
[data-disabled]

Present when disabled

[data-orientation]"vertical" |"horizontal"

内容

包含项目的可折叠内容。

属性类型默认值
asChild
boolean
false
forceMount
boolean
无默认值
数据属性
[data-state]"open" |"closed"
[data-disabled]

Present when disabled

[data-orientation]"vertical" |"horizontal"
CSS 变量描述
--radix-accordion-content-width内容在打开/关闭时的宽度
--radix-accordion-content-height内容在打开/关闭时的高度

示例

默认展开

使用 defaultValue 属性来默认定义打开的项目。

<Accordion.Root type="single" defaultValue="item-2">
<Accordion.Item value="item-1"></Accordion.Item>
<Accordion.Item value="item-2"></Accordion.Item>
</Accordion.Root>

允许折叠所有项目

使用 collapsible 属性来允许所有项目关闭。

<Accordion.Root type="single" collapsible>
<Accordion.Item value="item-1"></Accordion.Item>
<Accordion.Item value="item-2"></Accordion.Item>
</Accordion.Root>

同时打开多个项目

type 属性设置为 multiple 以启用一次打开多个项目。

<Accordion.Root type="multiple">
<Accordion.Item value="item-1"></Accordion.Item>
<Accordion.Item value="item-2"></Accordion.Item>
</Accordion.Root>

打开时旋转图标

您可以添加额外的装饰元素,例如 Chevron,并在项目打开时旋转它。

// index.jsx
import { Accordion } from "radix-ui";
import { ChevronDownIcon } from "@radix-ui/react-icons";
import "./styles.css";
export default () => (
<Accordion.Root type="single">
<Accordion.Item value="item-1">
<Accordion.Header>
<Accordion.Trigger className="AccordionTrigger">
<span>Trigger text</span>
<ChevronDownIcon className="AccordionChevron" aria-hidden />
</Accordion.Trigger>
</Accordion.Header>
<Accordion.Content></Accordion.Content>
</Accordion.Item>
</Accordion.Root>
);
/* styles.css */
.AccordionChevron {
transition: transform 300ms;
}
.AccordionTrigger[data-state="open"] > .AccordionChevron {
transform: rotate(180deg);
}

水平方向

使用 orientation 属性来创建水平手风琴。

<Accordion.Root orientation="horizontal">
<Accordion.Item value="item-1"></Accordion.Item>
<Accordion.Item value="item-2"></Accordion.Item>
</Accordion.Root>

动画化内容大小

使用 --radix-accordion-content-width 和/或 --radix-accordion-content-height CSS 变量来动画化内容在打开/关闭时的大小

// index.jsx
import { Accordion } from "radix-ui";
import "./styles.css";
export default () => (
<Accordion.Root type="single">
<Accordion.Item value="item-1">
<Accordion.Header></Accordion.Header>
<Accordion.Content className="AccordionContent"></Accordion.Content>
</Accordion.Item>
</Accordion.Root>
);
/* styles.css */
.AccordionContent {
overflow: hidden;
}
.AccordionContent[data-state="open"] {
animation: slideDown 300ms ease-out;
}
.AccordionContent[data-state="closed"] {
animation: slideUp 300ms ease-out;
}
@keyframes slideDown {
from {
height: 0;
}
to {
height: var(--radix-accordion-content-height);
}
}
@keyframes slideUp {
from {
height: var(--radix-accordion-content-height);
}
to {
height: 0;
}
}

可访问性

遵循 Accordion WAI-ARIA 设计模式

键盘交互

按键描述
空格键
当焦点位于折叠部分的 Accordion.Trigger 上时,展开该部分。
Enter 键
当焦点位于折叠部分的 Accordion.Trigger 上时,展开该部分。
Tab 键
将焦点移动到下一个可聚焦元素。
Shift + Tab 键
将焦点移动到上一个可聚焦元素。
向下箭头键
当... orientationvertical 时,将焦点移动到下一个 Accordion.Trigger
向上箭头键
当... orientationvertical 时,将焦点移动到下一个 Accordion.Trigger
向右箭头键
当... orientationhorizontal 时,将焦点移动到下一个 Accordion.Trigger
向左箭头键
当... orientationhorizontal 时,将焦点移动到下一个 Accordion.Trigger
Home 键
当焦点位于 Accordion.Trigger 上时,将焦点移动到第一个 Accordion.Trigger
End 键
当焦点位于 Accordion.Trigger 上时,将焦点移动到最后一个 Accordion.Trigger