手风琴
特性
- 完整的键盘导航。
- 支持水平/垂直方向。
- 支持从右到左方向。
- 可以展开一个或多个项目。
- 可以受控或不受控。
安装
从命令行安装此组件。
$ npm add reka-ui结构
导入所有部分并将其组合。
<script setup>
import { AccordionContent, AccordionHeader, AccordionItem, AccordionRoot, AccordionTrigger } from 'reka-ui'
</script>
<template>
<AccordionRoot>
<AccordionItem>
<AccordionHeader>
<AccordionTrigger />
</AccordionHeader>
<AccordionContent />
</AccordionItem>
</AccordionRoot>
</template>API 参考
根
包含手风琴的所有部分
| 属性 | 默认 | 类型 |
|---|---|---|
as | 'div' | AsTag | Component此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
collapsible | false | 布尔值当类型为“single”时,允许在点击已打开项的触发器时关闭内容。当类型为“multiple”时,此属性无效。 |
defaultValue | string | string[]项的默认活动值。 当您不需要控制项的状态时使用。 | |
dir | 'ltr' | 'rtl'手风琴的阅读方向(如果适用)。如果省略,则假定为 LTR(从左到右)阅读模式。 | |
disabled | false | 布尔值当 |
modelValue | string | string[]活动项的受控值。 当您需要控制项的状态时使用此项。可以通过 | |
orientation | 'vertical' | 'vertical' | 'horizontal'手风琴的方向。 |
type | 'single' | 'multiple'确定一次可以选择“单个”或“多个”项。 此属性将覆盖从 | |
unmountOnHide | true | 布尔值当 |
| 事件触发 | 载荷 |
|---|---|
update:modelValue | [value: string | string[]]当项的展开状态发生变化时调用的事件处理程序 |
| 插槽(默认) | 载荷 |
|---|---|
modelValue | AcceptableValue | AcceptableValue[] | undefined当前活动值 |
| 数据属性 | 值 |
|---|---|
[data-orientation] | "垂直" | "水平" |
项
包含可折叠部分的所有部分。
| 属性 | 默认 | 类型 |
|---|---|---|
as | 'div' | AsTag | Component此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
disabled | 布尔值手风琴项是否禁用用户交互。当为 | |
unmountOnHide | 布尔值当 | |
值* | string手风琴项的字符串值。手风琴内的所有项都应使用唯一值。 |
| 插槽(默认) | 载荷 |
|---|---|
open | 布尔值当前打开状态 |
| 数据属性 | 值 |
|---|---|
[data-state] | "打开" | "关闭" |
[data-disabled] | 禁用时存在 |
[data-orientation] | "垂直" | "水平" |
标题
包装一个 AccordionTrigger。使用 asChild 属性将其更新为页面上适当的标题级别。
| 属性 | 默认 | 类型 |
|---|---|---|
as | 'h3' | AsTag | Component此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
| 数据属性 | 值 |
|---|---|
[data-state] | "打开" | "关闭" |
[data-disabled] | 禁用时存在 |
[data-orientation] | "垂直" | "水平" |
触发器
切换其关联项的折叠状态。它应该嵌套在 AccordionHeader 内部。
| 属性 | 默认 | 类型 |
|---|---|---|
as | 'div' | AsTag | Component此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 |
| 数据属性 | 值 |
|---|---|
[data-state] | "打开" | "关闭" |
[data-disabled] | 禁用时存在 |
[data-orientation] | "垂直" | "水平" |
内容
包含项的可折叠内容。
| 属性 | 默认 | 类型 |
|---|---|---|
as | 'div' | AsTag | Component此组件应渲染为的元素或组件。可通过 |
asChild | 布尔值更改默认渲染元素为作为子项传递的元素,合并它们的属性和行为。 阅读我们的 组合指南了解更多详情。 | |
forceMount | 布尔值当需要更多控制时,用于强制挂载。在与 Vue 动画库控制动画时很有用。 |
| 数据属性 | 值 |
|---|---|
[data-state] | "打开" | "关闭" |
[data-disabled] | 禁用时存在 |
[data-orientation] | "垂直" | "水平" |
| CSS 变量 | 描述 |
|---|---|
--reka-accordion-content-width | 内容打开/关闭时的宽度 |
--reka-accordion-content-height | 内容打开/关闭时的高度 |
示例
默认展开
使用 defaultValue 属性默认定义打开的项。
<template>
<AccordionRoot
type="single"
default-value="item-2"
>
<AccordionItem value="item-1">
…
</AccordionItem>
<AccordionItem value="item-2">
…
</AccordionItem>
</AccordionRoot>
</template>允许折叠所有项
使用 collapsible 属性允许所有项关闭。
<template>
<AccordionRoot
type="single"
collapsible
>
<AccordionItem value="item-1">
…
</AccordionItem>
<AccordionItem value="item-2">
…
</AccordionItem>
</AccordionRoot>
</template>同时打开多个项
将 type 属性设置为 multiple 以允许同时打开多个项。
<template>
<AccordionRoot type="multiple">
<AccordionItem value="item-1">
…
</AccordionItem>
<AccordionItem value="item-2">
…
</AccordionItem>
</AccordionRoot>
</template>打开时图标旋转
您可以添加额外的装饰元素,例如V形箭头,并在项目打开时旋转它。
// index.vue
<script setup>
import { Icon } from '@iconify/vue'
import { AccordionContent, AccordionHeader, AccordionItem, AccordionRoot, AccordionTrigger } from 'reka-ui'
import './styles.css'
</script>
<template>
<AccordionRoot type="single">
<AccordionItem value="item-1">
<AccordionHeader>
<AccordionTrigger class="AccordionTrigger">
<span>Trigger text</span>
<Icon
icon="radix-icons:chevron-down"
class="AccordionChevron"
/>
</AccordionTrigger>
</AccordionHeader>
<AccordionContent>…</AccordionContent>
</AccordionItem>
</AccordionRoot>
</template>/* styles.css */
.AccordionChevron {
transition: transform 300ms;
}
.AccordionTrigger[data-state="open"] > .AccordionChevron {
transform: rotate(180deg);
}水平方向
使用 orientation 属性创建水平手风琴
<template>
<AccordionRoot orientation="horizontal">
<AccordionItem value="item-1">
…
</AccordionItem>
<AccordionItem value="item-2">
…
</AccordionItem>
</AccordionRoot>
</template>内容大小动画
使用 --reka-accordion-content-width 和/或 --reka-accordion-content-height CSS 变量来动画化内容打开/关闭时的大小
// index.vue
<script setup>
import { AccordionContent, AccordionHeader, AccordionItem, AccordionRoot, AccordionTrigger } from 'reka-ui'
import './styles.css'
</script>
<template>
<AccordionRoot type="single">
<AccordionItem value="item-1">
<AccordionHeader>…</AccordionHeader>
<AccordionContent class="AccordionContent">
…
</AccordionContent>
</AccordionItem>
</AccordionRoot>
</template>/* 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(--reka-accordion-content-height);
}
}
@keyframes slideUp {
from {
height: var(--reka-accordion-content-height);
}
to {
height: 0;
}
}即使关闭也渲染内容
默认情况下,隐藏内容将被移除,使用 :unmountOnHide="false" 以保持内容始终可用。
这也将允许浏览器搜索隐藏文本,并打开手风琴。
<template>
<AccordionRoot :unmount-on-hide="false">
<AccordionItem value="item-1">
…
</AccordionItem>
<AccordionItem value="item-2">
…
</AccordionItem>
</AccordionRoot>
</template>无障碍性
键盘交互
| 键 | 描述 |
|---|---|
空格键 | 当焦点位于折叠部分的 AccordionTrigger 上时,展开该部分。 |
回车键 | 当焦点位于折叠部分的 AccordionTrigger 上时,展开该部分。 |
Tab | 将焦点移动到下一个可聚焦元素。 |
Shift + Tab | 将焦点移至上一个可聚焦元素。 |
向下箭头键 | 当 orientation 为 vertical 时,将焦点移动到下一个 AccordionTrigger。 |
向上箭头键 | 当 orientation 为 vertical 时,将焦点移动到上一个 AccordionTrigger。 |
向右箭头 | 当 orientation 为 horizontal 时,将焦点移动到下一个 AccordionTrigger。 |
向左箭头 | 当 orientation 为 horizontal 时,将焦点移动到上一个 AccordionTrigger。 |
Home | 当焦点位于 AccordionTrigger 上时,将焦点移动到起始 AccordionTrigger。 |
End | 当焦点位于 AccordionTrigger 上时,将焦点移动到最后一个 AccordionTrigger。 |
