ProComponents, templates & AI tooling
HeroUI
27.7k

Accordion 手风琴

用于在紧凑空间中组织信息的可折叠内容面板。

引入

import { Accordion } from '@heroui/react';

用法

import {
  ArrowsRotateLeft,
  Box,
  ChevronDown,
  CreditCard,

组件结构

引入 Accordion 组件并通过点语法访问所有子部分。

import { Accordion } from '@heroui/react';

export default () => (
  <Accordion>
    <Accordion.Item>
      <Accordion.Heading>
        <Accordion.Trigger>
          <Accordion.Indicator />
        </Accordion.Trigger>
      </Accordion.Heading>
      <Accordion.Panel>
        <Accordion.Body/>
      </Accordion.Panel>
    </Accordion.Item>
  </Accordion>
)

Surface

import {
  ArrowsRotateLeft,
  Box,
  ChevronDown,
  CreditCard,

多项同时展开

import {Accordion} from "@heroui/react";

export function Multiple() {
  return (
    <Accordion allowsMultipleExpanded className="w-full max-w-md">

受控

已展开:getting-started

了解 HeroUI 的基础知识,以及如何将其集成到你的 React 项目中。本节涵盖安装、配置和你的第一个组件。

"use client";

import {ChevronDown, ChevronUp} from "@gravity-ui/icons";
import {Accordion, Button, useDisclosureGroupNavigation} from "@heroui/react";
import React from "react";

自定义指示器

"use client";

import type {Key} from "@heroui/react";

import {ChevronsDown, CircleChevronDown, Minus, Plus} from "@gravity-ui/icons";

禁用状态

整个手风琴禁用

单独禁用条目

import {Accordion} from "@heroui/react";

export function Disabled() {
  return (
    <div className="flex w-full flex-col items-center gap-8">

FAQ 布局

常见问题

关于许可与使用,你需要了解的内容都在这里。

常规

许可

支持

import {ChevronDown} from "@gravity-ui/icons";
import {Accordion} from "@heroui/react";

export function FAQ() {
  const categories = [

自定义样式

import {ChevronDown} from "@gravity-ui/icons";
import {Accordion, cn} from "@heroui/react";

const items = [
  {

无分隔线

import {ChevronDown, CreditCard, Receipt, ShoppingBag} from "@gravity-ui/icons";
import {Accordion} from "@heroui/react";

const items = [
  {

自定义渲染函数

"use client";

import {
  ArrowsRotateLeft,
  Box,

样式

传入 Tailwind CSS 类

"use client";

import { Accordion, cn } from "@heroui/react";
import {Icon} from "@iconify/react";

自定义组件类

若要自定义 Accordion 组件类,可使用 @layer components 指令。
了解更多

@layer components {
  .accordion {
    @apply rounded-xl bg-gray-50;
  }

  .accordion__trigger {
    @apply font-semibold text-lg;
  }

  .accordion--outline {
    @apply shadow-lg border-2;
  }
}

HeroUI 遵循 BEM 方法论,确保组件变体与状态可复用且易于自定义。

CSS 类

Accordion 组件使用以下 CSS 类(查看源码样式):

基础类

  • .accordion - Accordion 根容器
  • .accordion__body - 正文容器
  • .accordion__heading - 标题包裹层
  • .accordion__indicator - 展开/收起指示图标
  • .accordion__item - 单个 Accordion 项
  • .accordion__panel - 可折叠面板容器
  • .accordion__trigger - 可点击的触发按钮

变体类

  • .accordion--outline - 描边变体(边框与背景)

状态类

  • .accordion__trigger[aria-expanded="true"] - 展开状态
  • .accordion__panel[aria-hidden="false"] - 面板可见状态

交互状态

该组件同时支持 CSS 伪类与 data 属性:

  • 悬停:触发器上 :hover[data-hovered="true"]
  • 聚焦:触发器上 :focus-visible[data-focus-visible="true"]
  • 禁用:触发器上 :disabled[aria-disabled="true"]
  • 展开:触发器上 [aria-expanded="true"]

API 参考

Accordion Props

Prop类型默认值描述
allowsMultipleExpandedbooleanfalse是否允许多项同时展开。
defaultExpandedKeysIterable<Key>-初始展开的 key。
expandedKeysIterable<Key>-受控的展开 key。
onExpandedChange(keys: Set<Key>) => void-展开 key 变化时调用的事件处理函数。
isDisabledbooleanfalse是否禁用整个 Accordion。
variant"default" | "surface""default"Accordion 的视觉变体。
hideSeparatorbooleanfalse是否隐藏 Accordion 项之间的分隔线。
classNamestring-额外的 Tailwind CSS 类。
childrenReactNode-Accordion 项。
renderDOMRenderFunction<keyof React.JSX.IntrinsicElements, AccordionRenderProps>-使用自定义渲染函数覆盖默认 DOM 元素。

Accordion.Item Props

Prop类型默认值描述
idKey-该项的唯一标识。
isDisabledbooleanfalse是否禁用该项。
defaultExpandedbooleanfalse初始是否展开。
isExpandedboolean-受控展开状态。
onExpandedChange(isExpanded: boolean) => void-展开状态变化时调用的事件处理函数。
classNamestring-额外的 Tailwind CSS 类。
childrenReactNode-项内容。
renderDOMRenderFunction<keyof React.JSX.IntrinsicElements, AccordionItemRenderProps>-使用自定义渲染函数覆盖默认 DOM 元素。

Accordion.Trigger Props

Prop类型默认值描述
classNamestring-额外的 Tailwind CSS 类。
childrenReactNode | RenderFunction-触发器内容或渲染函数。
onPress() => void-额外的按下事件处理函数。
isDisabledboolean-是否禁用触发器。
renderDOMRenderFunction<keyof React.JSX.IntrinsicElements, TriggerRenderProps>-使用自定义渲染函数覆盖默认 DOM 元素。

Accordion.Panel Props

Prop类型默认值描述
classNamestring-额外的 Tailwind CSS 类。
childrenReactNode-面板内容。
renderDOMRenderFunction<keyof React.JSX.IntrinsicElements, AccordionPanelRenderProps>-使用自定义渲染函数覆盖默认 DOM 元素。

Accordion.Indicator Props

Prop类型默认值描述
classNamestring-额外的 Tailwind CSS 类。
childrenReactNode-自定义指示图标。

Accordion.Body Props

Prop类型默认值描述
classNamestring-额外的 Tailwind CSS 类。
childrenReactNode-正文内容。

本页目录