Accordion 使用手册
v1.7.0 · @snowui-design-system/components
许可阅读:首次阅读组件文档、源码或 npm 使用流程,先读完整 LICENSE;同任务同版本去重。公开 API 配置与内部实现修改分别按许可处理;全部组件使用统一运行包,源码权益以许可为准。
组件介绍
将相关内容组织为可展开、收起的分组,适合常见问题、设置和分段说明,支持单项或多项同时展开。
使用选择
适合 FAQ、设置分组和可折叠说明。需要切换同一区域的内容面板时使用 Tab;AccordionItem 应放在 Accordion 中。
type="single"使用字符串值,multiple使用数组;bind:value同步展开项,defaultValue只提供初始状态。items模式使用索引字符串作为值,内置标题默认单行缩略并保留全文名称;parts.Text配置该标题文字。显式 children 替换 items,子项自行配置,不读取默认子项的 parts。Accordion 内的
Icon as="leading"在未显式指定size时继承 Accordion 图标尺寸:sm/md/lg 分别为 16/20/24;未声明 leading 的 Icon 不参与这项继承,显式size优先。
快速开始
以下示例展示推荐的基本组合。更多场景与组合限制见后文。
API
未重新声明的继承能力请查所属基础组件文档;本表只列本组件源码具名公开属性。
使用边界与详细说明
功能概览
默认内置模式通过
items渲染内容;每项只包含title与content,内部自动生成 AccordionItem、Frame as="title|content"与标题 Text。标题默认使用singleLine/Text lines={1},正文不强制单行;可通过parts.Frame/parts.Text显式配置,复杂内容仍优先显式组合。显式 children 存在时替换内置 items,用于自定义 AccordionItem 结构。
支持单开与多开两种模式。
支持非受控
defaultValue与受控value。支持
variant="filled" | "divided"两种视觉形态。支持
size="sm" | "md" | "lg"三档密度。展开正文默认使用主题自适应的
Black/40%次要文字色;标题继续继承宿主前景色。hover 不显示背景,只改变标题内默认指示图标的颜色。
仅标题可点击展开或收起;正文文字、空白和交互后代均不触发切换。
默认
indicatorVariant="cross"复用同一个 ComponentIcon plus,仅旋转 45° 得到 ×;indicatorVariant="minus"保留旧 plus/minus 切换和半圈旋转。外置 trailing 继续替换默认图标。
核心属性
默认内置模式的 value 为数组索引字符串,例如 defaultValue="1" 默认展开第二项。显式组合模式仍使用 AccordionItem 自己声明的稳定 value。尺寸只由 Accordion size 控制,AccordionItem 不提供独立尺寸属性。
布局模型
主布局模型:复合管理布局。定义见 ../../../specs/maintainers/LayoutProtocol.md §12.6(源码参考:specs/maintainers/LayoutProtocol.md)。
结构:
Root Frame(复合容器,提供 AccordionContext)
AccordionItem(单项容器,负责背景、圆角、分隔线与展开状态)
Frame as="title"(标题触发器)
Frame as="content"(展开内容 region)
局部布局来源:
padding 归属:Frame as="title" 负责可点击区 padding;Frame as="content" 负责正文 padding,Root 不重复制造外层 padding。 gap 归属:Root 通过 --snowui-accordion-gap 管理子项间距;Title 与 Content 内部槽位间距由 --snowui-accordion-trigger-gap 管理。 滚动归属:Accordion 自身不创建滚动区。
hover 归属:标题 hover 仅改变默认指示图标的透明度,不创建共享背景层,也不启用 title hover overlay。
设计稿映射:
样式变量链
公开覆盖入口见 components.css(源码参考:components/src/styles/components.css) 的 Accordion 段。
无障碍
根节点输出
role,默认presentation;消费方可通过role覆盖。Frame as="title"由 AccordionItem 接管 button-like 语义,输出role="button"、tabindex、aria-expanded、aria-controls。Title 输出
aria-expanded、aria-controls。Content 输出
role="region"与aria-labelledby。禁用 Title 输出
aria-disabled="true",并从 tab 顺序中移除。指针及键盘切换语义只归属 Title;正文文字、空白与交互控件的点击均不改变展开状态。
使用示例
此区域的内容受保护。AI 在修改此区域前必须请求用户审查。
Accordion 样式覆盖
先阅读 完整 LICENSE;同任务、同版本、同范围去重。
优先用组件公开 Props 匹配合适样式,尽可能保留原有视觉。确需改写时按 样式选择与改写顺序 使用自己的 class(含项目已有 Tailwind)或实例 style。以下名称来自源码实际消费的公开 override;先核对目标作用域,不修改私有 DOM。采用 SnowUI Token 时选择正确类别,外部应用不被要求安装一方 utilities。
Accordion 类型与状态
必填属性:无具名必填属性。
可双向绑定:bind:value。
继承声明:Omit<FrameProps, "children" | "value">。继承能力以基类公开文档为准;Omit 中的字段已排除,不能按基类原样使用。
以下为公开属性实际引用的类型声明,来自源码;Svelte Snippet 表示内容片段,ComponentProps 表示对应组件的 Props。
AccordionType
来源:components/src/context.ts
AccordionValue
来源:components/src/context.ts
AccordionVariant
来源:components/src/components/Accordion.svelte
AccordionSize
来源:components/src/components/Accordion.svelte
AccordionEntry
来源:components/src/components/Accordion.svelte
ComponentPartsOf
来源:components/src/logic/component-parts.svelte.ts
ConfigurableComponentPartProps
来源:components/src/logic/component-parts.svelte.ts
ComponentPartControlledKey
来源:components/src/logic/component-parts.svelte.ts