标签
概述
用于在内容行内对内容进行分类、筛选或标记的紧凑型标签。STag 组合 Aria 层 Tag 基础组件(零样式)与 tagVariants 样式配方(8 种颜色 × 6 种尺寸 × 5 种变体 × 2 种形状),并暴露 leading/trailing/close 插槽。
适用于状态标签、分类胶囊、关键词或可筛选的元数据。需要叠加在宿主元素上作为数量/通知气泡的标记请优先使用 badge;需要承载更大上下文反馈的提示请优先使用 alert。
STag 支持 v-model:open 受控显隐与带本地化可访问标签的 closable 关闭按钮。Aria 层 Tag 基础组件通过插槽 props 暴露 close 动作,便于完全自定义组合。
用法
特性
- 🧩 Aria/样式分离 — Aria 层
Tag负责open/close状态;STag注入tagVariants类并提供默认关闭控件 - 🎨 8 种颜色 —
ThemeColor值(primary/destructive/success/warning/info/carbon/secondary/accent) - 🖌️ 5 种变体 —
solid/pure/outline/soft/ghost/raw,覆盖实心、描边与淡色等外观 - 📐 6 种尺寸 — 来自
ThemeSize的 xs–2xl - 🟦 2 种形状 —
auto(圆角)与rounded(胶囊) - ❌ 可关闭 —
closable渲染由v-model:open驱动的关闭按钮;关闭控件为带本地化aria-label的真实<button>(可键盘操作) - 🌐 RTL 就绪 — 布局使用 inline-flex 与逻辑间距
- ♿ 无障碍友好 — 关闭按钮可聚焦、拥有可访问名称,默认态与可关闭态
axe-core均零违规
组件家族
STag(样式层)— 入口包装组件;tagVariants配方 +leading/trailing/close插槽Tag(Aria)— 状态基础组件;通过useControllableState维护open,并通过插槽 props 暴露close动作
演示
基础
插槽
API
Aria 层
1Tag
属性
| 属性名 | 类型 | 默认值 | 描述 |
|---|---|---|---|
class | ClassValue | — | 应用于根元素的额外类名。 |
color | ThemeColor | — | 组件的主题颜色。 |
size | ThemeSize | — | 组件的视觉尺寸。 |
variant | TagVariant | — | 该组件的视觉变体。 |
shape | TagShape | — | 组件的结构。 |
content | string | — | 内容。 |
closable | boolean | — | 该组件是否可以闭合。 |
open | boolean | — | 该组件是否为开源。若提供该信息,则受控。 |
事件
| 事件名 | 参数 | 描述 |
|---|---|---|
update:open | boolean | 在打开状态发生变化时触发。 |
注意事项
架构与对标差异
Aria 层 Tag 是最小的显隐/关闭状态基础组件,STag 将全部样式收敛到 tagVariants 配方,并提供默认关闭控件。这与 shadcn/ui 的 headless/样式分离一致;而 Ant Design、Element Plus、Mantine、Naive UI 则提供带 closable/onClose prop 的单一样式化标签。VeanUI 的关闭按钮是可聚焦的真实 <button>,其 aria-label 由 tag.remove(如 Remove {label})本地化而来;多个对标库则依赖对屏幕阅读器不够健壮的纯 × 字形。
| 能力 | VeanUI | shadcn/ui | Ant Design Tag | Element Plus Tag | Mantine Badge | Naive UI Tag |
|---|---|---|---|---|---|---|
| Aria/样式分离 | ✅ | ✅ | — | — | — | — |
| 颜色变体(8) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 变体(solid/outline/soft) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 尺寸变体(6) | ✅ | — | ✅ | ✅ | ✅ | ✅ |
| 形状(auto / 胶囊) | ✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
| 可关闭标签 | ✅ | — | ✅ | ✅ | — | ✅ |
本地化关闭 aria-label | ✅ | — | — | ✅ | — | — |
受控显隐(open) | ✅ | — | — | — | — | — |
| RTL 就绪 | ✅ | ✅ | ✅ | — | — | ✅ |
— = 不支持或采用不同交互模型。
运行时注意
- 关闭按钮的
aria-label由本地化tag.remove模板基于contentprop 生成。若你通过default插槽而非content传入标签文本,默认关闭aria-label将回退为纯动词——请通过close插槽或contentprop 覆盖。 open默认true。使用:open="false"或v-model:open控制显隐。variant="pure"/outline会刻意用foreground/bordertoken 覆盖颜色前景色;soft/ghost使用半透明色给背景着色。- 关闭按钮继承标签文本颜色并使用透明背景/边框;在
soft背景上依然可见,但请为你选择的颜色/背景组合验证对比度。 - 标签根节点为
<div>——若需要整块标签可点击,请自行在外层包裹链接或按钮。
Roadmap
核心标签 API 无阻塞缺口。独立的 tag-group 与 checkable 标签行为为已评估增强项,记录在 docs/roadmap/README.md。
FAQ
如何制作可关闭的标签?
设置 closable 并用 v-model 绑定 open:
<STag v-model:open="open" closable content="Linux" />如何响应标签关闭?
监听 @update:open——点击关闭按钮时会发出 false:
<STag :open="open" closable content="Linux" @update:open="onClose" />如何改变变体、形状与颜色?
使用 variant(solid/pure/outline/soft/ghost/raw)、shape(auto/rounded)与 color:
<STag variant="soft" shape="rounded" color="success" content="Active" />如何在文本前后添加图标?
使用 leading / trailing 插槽:
<STag content="Status">
<template #leading><SIcon icon="lucide:circle" /></template>
</STag>如何自定义关闭按钮?
使用 close 插槽并从其 props 中读取 close 动作:
<STag v-model:open="open" closable content="Linux">
<template #close="{ close }">
<button type="button" aria-label="Dismiss" @click="close">×</button>
</template>
</STag>