组件
返回目录
组件详情入口
通用
@vean/ui
SIcon

Icon

Icon 属于 通用 分类。建议先看演示与用法,再对照 API 表格完成接入和样式调整。

先用快捷跳转面板找到概述、用法、演示和 API,再往下细读完整文档内容。

快速跳转

同分类组件

如果你在同一类交互里做组合,这些组件通常会一起出现。

图标

概述

SIcon 是基于 Iconify 构建的统一图标组件。支持渲染 Iconify 图标集中的图标,也支持自定义 Vue 组件、VNodes 或字符串。通过与 SConfigProvider 集成,可在应用范围内统一管理图标尺寸。

特性

  • 📦 Iconify 支持:渲染来自 Iconify 海量图标库的任意图标。
  • 🔧 自定义图标:支持 Vue 组件、VNodes 或纯字符串。
  • 📏 全局尺寸:从 SConfigProvider 继承默认尺寸。
  • 🎨 样式定制:通过 props 或 CSS 类轻松定制。
  • ♿ 无障碍支持:装饰性图标默认 aria-hidden,语义图标通过 aria-label / aria-labelledby 暴露。

基础用法

使用 Iconify 名称

<script setup lang="ts">
import { SIcon } from '@vean/ui';
</script>

<template>
  <SIcon icon="lucide:home" />
  <SIcon icon="mdi:account" class="text-primary" />
</template>

自定义尺寸

<template>
  <SIcon icon="lucide:settings" width="24" height="24" />
</template>

也可通过 SConfigProvider 全局设置默认尺寸:

<script setup lang="ts">
import { SConfigProvider, SIcon } from '@vean/ui';
</script>

<template>
  <SConfigProvider :iconify="{ width: '1.5rem', height: '1.5rem' }">
    <SIcon icon="lucide:home" />
  </SConfigProvider>
</template>

自定义图标组件

<script setup lang="ts">
import { SIcon } from '@vean/ui';
import CustomIcon from './CustomIcon.vue';
</script>

<template>
  <SIcon :icon="CustomIcon" />
</template>

无障碍

  • 装饰性图标(默认):自动设置 aria-hidden="true",对辅助技术隐藏。
  • 语义图标:传入 aria-label 或 ariaLabelledby 后,aria-hidden 不会设置,图标会对辅助技术可见。
<template>
  <!-- 装饰性:aria-hidden="true" -->
  <SIcon icon="lucide:check" />

  <!-- 语义性:aria-label 暴露图标 -->
  <SIcon icon="lucide:check" aria-label="已完成" />
</template>

API

Aria 层

1

Icon

4 属性
属性
属性名类型默认值描述
icon
IconValue
—
由该组件渲染的图标。
ariaHidden
boolean
—
该图标是否对辅助技术隐藏。 对于装饰性图标,默认值为 `true`。若要显示该图标,请将其设置为 `false` 或提供 `ariaLabel` / `ariaLabelledby`。
ariaLabel
string
—
图标的无障碍标签。当提供该标签时,不会设置 `aria-hidden`,以便系统能够朗读该标签。
ariaLabelledby
string
—
用于标注图标的元素 ID。当提供该属性时,不会设置 `aria-hidden`,以便朗读标签内容。

说明

架构与基准差异

VeanUI 将图标拆分为 Aria 层(@vean/aria 中的 _icon,提供 IconValue 类型和渲染钩子)和 styled 层(@vean/ui 中的 SIcon,封装 Iconify 渲染、尺寸继承和无障碍逻辑)。这不同于 Ant Design、Element Plus 等单包方案。

方面VeanUIAnt Design / Element Plus / MUI / Mantine / Naive UI
架构Aria + styled 分层单包
图标来源Iconify(按需加载 200+ 图标集)内置图标集 / 自定义 SVG
样式UnoCSS 工具类CSS-in-JS / SCSS / CSS 变量
尺寸prop + SConfigProvider 全局继承prop / token
无障碍装饰/语义自动区分,aria-hidden 智能默认手动设置 aria-label

FAQ

为什么默认设置了 aria-hidden="true"? 大部分图标是装饰性的,仅作为视觉辅助。默认 aria-hidden="true" 可避免屏幕阅读器朗读无意义的图标名称。当图标具有语义时,传入 aria-label 或 ariaLabelledby 即可自动移除 aria-hidden。

如何使用 Iconify 字符串名称? 传入 icon="prefix:name" 格式的字符串,例如 icon="lucide:home"。Iconify 会按需从 API 加载图标数据。也可通过 addIcon / addCollection 预注册图标数据以实现离线使用。

如何旋转或翻转图标? 翻转使用 hFlip(水平镜像)或 vFlip(垂直镜像),旋转使用 rotate,基线对齐使用 inline,这些 props 会直接透传给 Iconify:

<template>
  <SIcon icon="lucide:arrow-right" :h-flip="true" />
  <SIcon icon="lucide:refresh-cw" rotate="90deg" />
  <SIcon icon="lucide:home" inline />
</template>

rotate 支持字符串(如 "90deg")或数值(90° 的倍数,如 1 表示 90°、2 表示 180°)。

SConfigProvider 的尺寸优先级如何? prop 上直接传入的 width / height 优先于 SConfigProvider 中配置的 iconify.width / iconify.height。

支持 SSR 吗? 支持。Iconify 组件在 SSR 环境下会渲染空占位,客户端水合后加载图标数据。如需 SSR 即时渲染,可预注册图标数据。

更新日志

版本记录按发布版本分组,便于快速查看这个组件在不同版本里的实际变更。

v0.40.0

2026-09-14

对比版本

修复

允许异步加载的图标出现水化不匹配的情况

范围: icon作者: soybeanfe查看提交17a16

修复

允许异步加载的图标出现水化不匹配的情况

范围: icon作者: soybeanfe查看提交17a16

v0.30.0

2026-08-20

对比版本

新功能

优化图标属性

范围: icon作者: soybeanfe查看提交206c5

修复

修复 aria-hidden、aria-label、shrink-0 和 data-soybean-icon 属性

范围: icon作者: soybeanjs查看提交cf042

新功能

优化图标属性

范围: icon作者: soybeanfe查看提交206c5

修复

修复 aria-hidden、aria-label、shrink-0 和 data-soybean-icon 属性

范围: icon作者: soybeanjs查看提交cf042

v0.29.0

2026-06-18

对比版本

修复

修正 useConfigProvider 的导入路径

范围: icon作者: soybeanjs查看提交7ad9c

修复

修正 useConfigProvider 的导入路径

范围: icon作者: soybeanjs查看提交7ad9c

v0.28.2

2026-05-30

对比版本

重构

简化图标处理并移除 Nuxt 特有的逻辑

范围: icon作者: soybeanfe查看提交63725

v0.26.0

2026-05-27

对比版本

修复

将图标道具类型更新为 IconValue,并增强对 Nuxt 的支持

范围: icon作者: soybeanfe查看提交b372a

修复

改进 Nuxt 图标处理和条件检查

范围: icon作者: soybeanfe查看提交8002e

v0.0.20

2026-01-21

对比版本

文档

更新 IconValue 属性的类型定义格式

范围: icon作者: soybeanjs查看提交58ec2

v0.0.2

2025-11-18

对比版本

新功能

在示例和组件中将 lucide-vue-next 的图标替换为 @iconify/vue,并更新包依赖项

范围: icon作者: soybeanjs查看提交47f24

新功能

引入了 Icon 组件,该组件具有可配置的属性,并集成了 ConfigProvider 以实现动态尺寸调整

范围: icon作者: soybeanjs查看提交ac117

修复

添加样式以防止图标缩小

范围: icon作者: soybeanjs查看提交1db8e

重构

将 Icon 组件重命名为 SIcon,以符合命名规范

范围: icon作者: soybeanjs查看提交f05a9

重构

移除默认的 color 属性,以提升图标自定义功能

范围: icon作者: soybeanjs查看提交47d42

重构

增强图标组件,使其支持 IconifyIcon 类型,并改进模板逻辑

范围: icon作者: soybeanjs查看提交043aa

新功能

在示例和组件中将 lucide-vue-next 的图标替换为 @iconify/vue,并更新包依赖项

范围: icon作者: soybeanjs查看提交47f24

新功能

引入了 Icon 组件,该组件具有可配置的属性,并集成了 ConfigProvider 以实现动态尺寸调整

范围: icon作者: soybeanjs查看提交ac117

修复

添加样式以防止图标缩小

范围: icon作者: soybeanjs查看提交1db8e

重构

将 Icon 组件重命名为 SIcon,以符合命名规范

范围: icon作者: soybeanjs查看提交f05a9

重构

移除默认的 color 属性,以提升图标自定义功能

范围: icon作者: soybeanjs查看提交47d42

重构

增强图标组件,使其支持 IconifyIcon 类型,并改进模板逻辑

范围: icon作者: soybeanjs查看提交043aa