JGuang / HeroUI

Accordion 手风琴

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

引入

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

用法

HeroUI 示例

组件结构

引入 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

HeroUI 示例

多项同时展开

HeroUI 示例

受控

HeroUI 示例

自定义指示器

HeroUI 示例

禁用状态

HeroUI 示例

FAQ 布局

HeroUI 示例

自定义样式

HeroUI 示例

无分隔线

HeroUI 示例

自定义渲染函数

HeroUI 示例

样式

传入 Tailwind CSS 类

  {items.map((item, index) => (
    
      
        
          {item.iconUrl ? (
            <img
              alt={item.title}
              className="group-hover/item:scale-120 group-hover/item:-rotate-10 h-11 w-11 transition-[scale,rotate] duration-300 ease-out group-hover/item:drop-shadow-lg"
              src={item.iconUrl}
            />
          ) : null}
          
            {item.title}
            {item.subtitle}
          
          svg]:size-4">
            
          
        
      
      
        {item.content}
      
    
  ))}

); }`} />

自定义组件类

若要自定义 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。
expandedKeysIterable-受控的展开 key。
onExpandedChange(keys: Set) => 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-正文内容。

本地来源: vendor/zh/react/components/(navigation)/accordion.mdx

文档根据 HeroUI v3 固定提交生成,已调整内部链接与交互预览以适配 JGuang。

On this page