Components

手风琴

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

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;

Features

    完整的键盘导航。

    支持横向/纵向方向。

    支持从右到左的方向。

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

    可以是受控或非受控的。

安装

从命令行安装组件。

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 参考

根元素

包含手风琴的所有部分。

PropTypeDefault
asChild
boolean
false
type*
enum
No default value
value
string
No default value
defaultValue
string
No default value
onValueChange
function
No default value
value
string[]
[]
defaultValue
string[]
[]
onValueChange
function
No default value
collapsible
boolean
false
disabled
boolean
false
dir
enum
"ltr"
orientation
enum
"vertical"
Data attributeValues
[data-orientation]"vertical" | "horizontal"

项目

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

PropTypeDefault
asChild
boolean
false
disabled
boolean
false
value*
string
No default value
Data attributeValues
[data-state]"open" | "closed"
[data-disabled]

禁用时存在

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

头部

包裹一个 Accordion.Trigger。 使用 asChild 属性将它更新为适合您页面的标题级别。

PropTypeDefault
asChild
boolean
false
Data attributeValues
[data-state]"open" | "closed"
[data-disabled]

禁用时存在

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

触发器

切换其关联项目的折叠状态。 应嵌套在 Accordion.Header 内部。

PropTypeDefault
asChild
boolean
false
Data attributeValues
[data-state]"open" | "closed"
[data-disabled]

禁用时存在

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

内容

包含项目的可折叠内容。

PropTypeDefault
asChild
boolean
false
forceMount
boolean
No default value
Data attributeValues
[data-state]"open" | "closed"
[data-disabled]

禁用时存在

[data-orientation]"vertical" | "horizontal"
CSS VariableDescription
--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>

打开时旋转图标

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

// 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>触发文本</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;
}
}

可访问性

遵循 手风琴 WAI-ARIA 设计模式

键盘交互

KeyDescription
Space
当焦点位于折叠部分的 Accordion.Trigger 上时,展开该部分。
Enter
当焦点位于折叠部分的 Accordion.Trigger 上时,展开该部分。
Tab
将焦点移到下一个可聚焦元素。
Shift + Tab
将焦点移到上一个可聚焦元素。
ArrowDown
orientationvertical 时,将焦点移动到下一个 Accordion.Trigger
ArrowUp
orientationvertical 时,将焦点移动到上一个 Accordion.Trigger
ArrowRight
orientationhorizontal 时,将焦点移动到下一个 Accordion.Trigger
ArrowLeft
orientationhorizontal 时,将焦点移动到上一个 Accordion.Trigger
Home
当焦点位于 Accordion.Trigger 上时,将焦点移到第一个 Accordion.Trigger
End
当焦点位于 Accordion.Trigger 上时,将焦点移到最后一个 Accordion.Trigger