更新记录
1.1.0(2026-09-05)
- 单独使用:自包含组件,import 后直接用
- 多色 SVG 图标:保留 path 自带 fill 颜色
- 换色:通过
color prop 动态修改单色图标颜色
- 渐变色:支持 linear / radial 渐变,自定义方向和色标
- URI 和 Base64:小程序/APP 端支持两种 data URI 编码格式
- spin 动画:CSS 旋转动画,可自定义周期
- rpx 尺寸:
size prop 支持数字 / px / rpx / 百分比
- 圆角:
radius prop 支持数字(px)和字符串(百分比)
- 缓存机制:三层 LRU 缓存(iconDef / svgHtml / dataUri),提升重复渲染性能
- iconfont 字体库:通过
unicode + fontFamily 渲染字体图标
- uni-icons 字体图标:内置 DCloud uni-icons 字体映射表,调用
addUniIconsFont() 注册后,可直接用 name 渲染(无需 <uni-icons> 组件,避免 easycom 注册问题和 Vue3 警告)
- 自定义字体图标:通过
addFontIcons(fontFamily, map) 注册任意 iconfont 字体映射表
- 自定义图标:支持
icon prop 内联传入、addIcons() 运行时注册、Vue.use() 插件模式
- 事件:支持 click / load / error 事件
平台兼容性
uni-app(5.0)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| √ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| √ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
√ |
ux-svg-icon 跨平台 SVG 图标组件
跨平台 SVG 图标组件,支持多色图标、换色、渐变色、URI/Base64 格式、spin 动画、rpx 尺寸、圆角、缓存机制、iconfont 字体库、uni-icons 字体映射,兼容 H5 / APP / 小程序,Vue2 / Vue3 双版本支持。
平台兼容性
| 平台 |
支持 |
渲染方式 |
| H5 (Chrome / Safari) |
✅ |
inline <svg> + CSS |
| APP (Android / iOS) |
✅ |
<image> data URI |
| 微信/支付宝/百度/头条/QQ 小程序 |
✅ |
<image> data URI |
| Vue 2 |
✅ |
条件编译兼容 |
| Vue 3 |
✅ |
条件编译兼容 |
功能特性
- 单独使用:自包含组件,import 后直接用
- 多色 SVG 图标:保留 path 自带 fill 颜色
- 换色:通过
color prop 动态修改单色图标颜色
- 渐变色:支持 linear / radial 渐变,自定义方向和色标
- URI 和 Base64:小程序/APP 端支持两种 data URI 编码格式
- spin 动画:CSS 旋转动画,可自定义周期
- rpx 尺寸:
size prop 支持数字 / px / rpx / 百分比
- 圆角:
radius prop 支持数字(px)和字符串(百分比)
- 缓存机制:三层 LRU 缓存(iconDef / svgHtml / dataUri),提升重复渲染性能
- iconfont 字体库:通过
unicode + fontFamily 渲染字体图标
- uni-icons 字体图标:内置 DCloud uni-icons 字体映射表,调用
addUniIconsFont() 注册后,可直接用 name 渲染(无需 <uni-icons> 组件,避免 easycom 注册问题和 Vue3 警告)
- 自定义字体图标:通过
addFontIcons(fontFamily, map) 注册任意 iconfont 字体映射表
- 自定义图标:支持
icon prop 内联传入、addIcons() 运行时注册、Vue.use() 插件模式
- 事件:支持 click / load / error 事件
快速使用
<template>
<!-- 基本用法 -->
<ux-svg-icon name="back" :size="24" color="#fff" />
<!-- rpx 尺寸 -->
<ux-svg-icon name="flash" size="48rpx" color="#FFD54F" />
<!-- 渐变色 -->
<ux-svg-icon name="check" :color="{
type: 'linear',
direction: 'to right',
stops: [
{ offset: '0%', color: '#FF6B6B' },
{ offset: '100%', color: '#4ECDC4' }
]
}" :size="32" />
<!-- spin 动画 -->
<ux-svg-icon name="loading" :spin="true" :spin-duration="0.8" :size="24" color="#4fc3f7" />
<!-- 圆角 -->
<ux-svg-icon name="back" :radius="8" :size="40" />
<!-- 内联传入完整 SVG -->
<ux-svg-icon icon="<svg viewBox='0 0 24 24'><path d='M12 2L2 22h20L12 2z'/></svg>" :size="32" />
<!-- iconfont 字体图标(直接传 unicode) -->
<ux-svg-icon type="iconfont" unicode="" font-family="iconfont" :size="24" color="#333" />
<!-- uni-icons 字体图标(addUniIconsFont 注册后,直接用 name) -->
<ux-svg-icon type="iconfont" font-family="uniicons" name="contact" :size="24" color="#fff" />
</template>
<script>
import UxSvgIcon from '@/uni_modules/ux-svg-icon/components/ux-svg-icon/ux-svg-icon.vue'
import { addUniIconsFont } from '@/uni_modules/ux-svg-icon/components/ux-svg-icon/uni-icons-font.js'
// 注册 uni-icons 字体映射表,注册后可用 name 渲染
// 同时需在 App.vue 全局 @font-face 引入 uni.ttf 字体文件(见下方"字体图标使用")
addUniIconsFont()
export default {
components: { UxSvgIcon },
}
</script>
Props
| 属性 |
类型 |
默认值 |
说明 |
| type |
String |
'svg' |
图标模式:'svg' / 'iconfont' |
| name |
String |
'' |
图标名称(svg 对应 icons.js key;iconfont 配合 addFontIcons 注册表用) |
| icon |
Object / String |
null |
内联图标定义(对象或 SVG 字符串),优先级高于 name |
| unicode |
String |
'' |
iconfont 模式的 unicode 字符 |
| fontFamily |
String |
'iconfont' |
iconfont 模式的字体族名 |
| size |
Number / String |
24 |
图标尺寸(数字=px / '24px' / '48rpx' / '50%') |
| color |
String / Object |
'#ffffff' |
图标颜色(HEX/RGB/CSS关键字/渐变对象) |
| strokeWidth |
Number / String |
2 |
stroke 线宽 |
| spin |
Boolean |
false |
是否旋转动画 |
| spinDuration |
Number / String |
1 |
spin 动画周期(秒) |
| format |
String |
'uri' |
data URI 格式:'uri' / 'base64' |
| radius |
Number / String |
0 |
圆角(数字=px / '50%') |
渐变色配置
{
type: 'linear', // 'linear' 或 'radial'
direction: 'to right', // 方向(见下表),仅 linear
stops: [ // 色标数组
{ offset: '0%', color: '#FF6B6B' },
{ offset: '100%', color: '#4ECDC4', opacity: 0.8 }
]
}
| direction 值 |
方向 |
'to right' / 'horizontal' |
左→右 |
'to left' |
右→左 |
'to bottom' / 'vertical' |
上→下 |
'to top' |
下→上 |
'to bottom right' / 'diagonal' |
左上→右下 |
'to bottom left' |
右上→左下 |
Events
| 事件名 |
参数 |
说明 |
| click |
{ name, type, width, height, originalEvent } |
点击图标 |
| load |
{ name, type, width, height } |
图标加载完成 |
| error |
{ name, type, width, height, message } |
图标加载失败 |
内置图标
| name |
说明 |
类型 |
| back |
返回箭头 |
stroke |
| flash |
闪光灯开 |
fill |
| flash-off |
闪光灯关 |
fill |
| switch-camera |
翻转相机 |
stroke |
| album |
相册选择 |
stroke |
| close |
关闭/取消 |
stroke |
| reset |
重置/旋转 |
stroke |
| check |
确认对勾 |
stroke |
| shutter |
快门 |
mixed |
| info |
提示信息 |
stroke |
| watermark |
水印标记 |
stroke |
| loading |
加载中 |
stroke |
| multi-color-demo |
多色示例 |
multiColor |
自定义图标
方式1:addIcons 运行时注册
import UxSvgIcon from '@/uni_modules/ux-svg-icon/components/ux-svg-icon/ux-svg-icon.vue'
UxSvgIcon.addIcons({
'my-icon': {
content: '<path d="M12 2L2 22h20L12 2z"/>',
fill: true,
viewBox: '0 0 24 24',
}
})
// 然后使用 <ux-svg-icon name="my-icon" />
方式2:icon prop 内联传入
<!-- 对象形式 -->
<ux-svg-icon :icon="{ content: '<path d=.../>', fill: true, viewBox: '0 0 24 24' }" />
<!-- 纯 SVG content 字符串 -->
<ux-svg-icon icon="<path d='M12 2L2 22h20L12 2z'/>" />
<!-- 完整 SVG 标签(自动提取 viewBox + 检测多色) -->
<ux-svg-icon icon="<svg viewBox='0 0 24 24'><path fill='#FF6B6B' d='...'/></svg>" />
方式3:Vue.use 插件模式
import UxSvgIcon from '@/uni_modules/ux-svg-icon/components/ux-svg-icon/ux-svg-icon.vue'
Vue.use(UxSvgIcon, {
icons: {
'my-icon': { content: '<path d=.../>', fill: true }
}
})
// 全局注册组件 + 图标,直接使用 <ux-svg-icon name="my-icon" />
方式4:svgToIcon 工具函数
import { svgToIcon } from '@/uni_modules/ux-svg-icon/components/ux-svg-icon/icons.js'
// 完整 SVG 字符串 → 图标定义对象(自动提取 viewBox/content/检测多色/判断 fill)
const iconDef = svgToIcon('<svg viewBox="0 0 24 24"><path d="..."/></svg>')
缓存机制
三层 LRU 缓存提升重复渲染性能:
| 缓存层 |
容量 |
作用 |
| iconDefCache |
100 |
normalizeIcon 结果(避免重复正则解析) |
| svgHtmlCache |
200 |
SVG HTML 字符串(避免重复拼接) |
| dataUriCache |
200 |
data URI 编码(避免重复编码) |
addIcons() 覆盖图标时自动清空缓存
UxSvgIcon.clearCache() 手动清空全部缓存
目录结构
uni_modules/ux-svg-icon/
├── components/ux-svg-icon/
│ ├── ux-svg-icon.vue # 组件主体
│ ├── icons.js # 图标定义 + addIcons + svgToIcon
│ ├── flash-off.js # flash-off 图标路径数据
│ ├── svg-to-icon.js # SVG 转 JS 对象工具
│ └── cache.js # LRU 缓存工具
├── package.json
├── changelog.md
└── readme.md