手风琴
<script setup lang="ts">
import { AccordionContent, AccordionHeader, AccordionItem, AccordionRoot, AccordionTrigger } from 'radix-vue'
import { Icon } from '@iconify/vue'
const accordionItems = [
{
value: 'item-1',
title: 'Is it accessible?',
content: 'Yes. It adheres to the WAI-ARIA design pattern.',
},
{
value: 'item-2',
title: 'Is it unstyled?',
content: 'Yes. It\'s unstyled by default, giving you freedom over the look and feel.',
},
{
value: 'item-3',
title: 'Can it be animated?',
content: 'Yes! You can use the transition prop to configure the animation.',
},
]
</script>
<template>
<AccordionRoot
class="bg-mauve6 w-[300px] rounded-md shadow-[0_2px_10px] shadow-black/5"
default-value="item-1"
type="single"
:collapsible="true"
>
<template
v-for="item in accordionItems"
:key="item.value"
>
<AccordionItem
class="focus-within:shadow-mauve12 mt-px overflow-hidden first:mt-0 first:rounded-t last:rounded-b focus-within:relative focus-within:z-10 focus-within:shadow-[0_0_0_2px]"
:value="item.value"
>
<AccordionHeader class="flex">
<AccordionTrigger class="text-grass11 shadow-mauve6 hover:bg-mauve2 flex h-[45px] flex-1 cursor-default items-center justify-between bg-white px-5 text-[15px] leading-none shadow-[0_1px_0] outline-none group">
<span>{{ item.title }}</span>
<Icon
icon="radix-icons:chevron-down"
class="text-green10 ease-[cubic-bezier(0.87,_0,_0.13,_1)] transition-transform duration-300 group-data-[state=open]:rotate-180"
aria-label="Expand/Collapse"
/>
</AccordionTrigger>
</AccordionHeader>
<AccordionContent class="text-mauve11 bg-mauve2 data-[state=open]:animate-slideDown data-[state=closed]:animate-slideUp overflow-hidden text-[15px]">
<div class="px-5 py-4">
{{ item.content }}
</div>
</AccordionContent>
</AccordionItem>
</template>
</AccordionRoot>
</template>特点
- 完整键盘导航。
- 支持水平/垂直方向。
- 支持从右到左方向。
- 可以展开一个或多个项目。
- 可以是受控或不受控的。
安装
从命令行安装组件。
$ npm add radix-vue解剖
导入所有部分并将它们拼凑在一起。
<script setup>
import { AccordionContent, AccordionHeader, AccordionItem, AccordionRoot, AccordionTrigger } from 'radix-vue'
</script>
<template>
<AccordionRoot>
<AccordionItem>
<AccordionHeader>
<AccordionTrigger />
</AccordionHeader>
<AccordionContent />
</AccordionItem>
</AccordionRoot>
</template>API 参考
根
包含手风琴的所有部分
| 道具 | 默认值 | 类型 |
|---|---|---|
as | 'div' | AsTag | 组件此组件应渲染成的元素或组件。可以被 |
asChild | 布尔值将默认渲染的元素更改为作为子元素传递的元素,合并它们的属性和行为。 阅读我们的 组合 指南以获取更多详细信息。 | |
collapsible | false | 布尔值当类型为“single”时,允许在单击打开项目的触发器时关闭内容。当类型为“multiple”时,此属性无效。 |
defaultValue | 字符串 | 字符串数组项目(s)的默认活动值。 当您不需要控制项目(s)的状态时使用。 | |
dir | 'ltr' | 'rtl'手风琴在适用时的阅读方向。如果省略,则假定为 LTR(从左到右)阅读模式。 | |
disabled | false | 布尔值当 |
modelValue | 字符串 | 字符串数组活动项目(s)的受控值。 当您需要控制项目的状态时使用。可以使用 | |
orientation | 'vertical' | 'vertical' | 'horizontal'手风琴的方向。 |
type | 'single' | 'multiple'确定一次可以按下“single”或“multiple”个项目。 如果定义了 |
| 发出 | 有效载荷 |
|---|---|
update:modelValue | [value: string | string[]]当项目的展开状态发生变化时调用的事件处理程序 |
| 插槽(默认) | 有效载荷 |
|---|---|
modelValue | 字符串 | 字符串数组 | 未定义当前活动值 |
| 数据属性 | 价值 |
|---|---|
[data-orientation] | "vertical" | "horizontal" |
项目
包含可折叠部分的所有部分。
| 道具 | 默认值 | 类型 |
|---|---|---|
as | 'div' | AsTag | 组件此组件应渲染成的元素或组件。可以被 |
asChild | 布尔值将默认渲染的元素更改为作为子元素传递的元素,合并它们的属性和行为。 阅读我们的 组合 指南以获取更多详细信息。 | |
disabled | 布尔值手风琴项目是否被禁用用户交互。当 | |
value* | 字符串手风琴项目的字符串值。手风琴中的所有项目都应使用唯一的值。 |
| 插槽(默认) | 有效载荷 |
|---|---|
open | 布尔值当前打开状态 |
| 数据属性 | 价值 |
|---|---|
[data-state] | "open" | "closed" |
[data-disabled] | 禁用时出现 |
[data-orientation] | "vertical" | "horizontal" |
标题
包装 AccordionTrigger。使用 asChild 属性将其更新为页面中合适的标题级别。
| 道具 | 默认值 | 类型 |
|---|---|---|
as | 'h3' | AsTag | 组件此组件应渲染成的元素或组件。可以被 |
asChild | 布尔值将默认渲染的元素更改为作为子元素传递的元素,合并它们的属性和行为。 阅读我们的 组合 指南以获取更多详细信息。 |
| 数据属性 | 价值 |
|---|---|
[data-state] | "open" | "closed" |
[data-disabled] | 禁用时出现 |
[data-orientation] | "vertical" | "horizontal" |
触发器
切换其关联项目的折叠状态。它应该嵌套在 AccordionHeader 中。
| 道具 | 默认值 | 类型 |
|---|---|---|
as | 'div' | AsTag | 组件此组件应渲染成的元素或组件。可以被 |
asChild | 布尔值将默认渲染的元素更改为作为子元素传递的元素,合并它们的属性和行为。 阅读我们的 组合 指南以获取更多详细信息。 |
| 数据属性 | 价值 |
|---|---|
[data-state] | "open" | "closed" |
[data-disabled] | 禁用时出现 |
[data-orientation] | "vertical" | "horizontal" |
内容
包含项目的可折叠内容。
| 道具 | 默认值 | 类型 |
|---|---|---|
as | 'div' | AsTag | 组件此组件应渲染成的元素或组件。可以被 |
asChild | 布尔值将默认渲染的元素更改为作为子元素传递的元素,合并它们的属性和行为。 阅读我们的 组合 指南以获取更多详细信息。 |
| 数据属性 | 价值 |
|---|---|
[data-state] | "open" | "closed" |
[data-disabled] | 禁用时出现 |
[data-orientation] | "vertical" | "horizontal" |
| CSS 变量 | 描述 |
|---|---|
--radix-accordion-content-width | 内容打开/关闭时的宽度 |
--radix-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>打开时旋转图标
您可以添加额外的装饰元素,例如斜杠,并在项目打开时旋转它。
// index.vue
<script setup>
import { AccordionContent, AccordionHeader, AccordionItem, AccordionRoot, AccordionTrigger } from 'radix-vue'
import { Icon } from '@iconify/vue'
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>动画内容大小
使用 --radix-accordion-content-width 和/或 --radix-accordion-content-height CSS 变量来动画内容打开/关闭时的尺寸
// index.vue
<script setup>
import { AccordionContent, AccordionHeader, AccordionItem, AccordionRoot, AccordionTrigger } from 'radix-vue'
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(--radix-accordion-content-height);
}
}
@keyframes slideUp {
from {
height: var(--radix-accordion-content-height);
}
to {
height: 0;
}
}无障碍性
键盘交互
| 关键 | 描述 |
|---|---|
空格 | 当焦点在折叠部分的 AccordionTrigger 上时,展开该部分。 |
输入 | 当焦点在折叠部分的 AccordionTrigger 上时,展开该部分。 |
制表符 | 将焦点移动到下一个可聚焦元素。 |
Shift + Tab | 将焦点移动到上一个可聚焦元素。 |
向下箭头 | 当 orientation 为 vertical 时,将焦点移动到下一个 AccordionTrigger。 |
向上箭头 | 当 orientation 为 vertical 时,将焦点移动到上一个 AccordionTrigger。 |
向右箭头 | 当 orientation 为 horizontal 时,将焦点移动到下一个 AccordionTrigger。 |
向左箭头 | 当 orientation 为 horizontal 时,将焦点移动到上一个 AccordionTrigger。 |
主页 | 当焦点在 AccordionTrigger 上时,将焦点移动到开始 AccordionTrigger。 |
结尾 | 当焦点在 AccordionTrigger 上时,将焦点移动到最后一个 AccordionTrigger。 |