为什么使用 SVG
而不是 IconFont
,可以看这篇文章 Inline SVG vs Icon Fonts
IconFont
作为一种字体,Icon 显示的大小和位置可能要受到 font-size
、line-height
、word-spacing
等等 CSS 属性的影响。 Icon 所在容器的 `CSS` 样式可能对 `Icon` 的位置产生影响,调整起来很不方便IconFont
,却只使用其中几个,非常浪费加载时间。 自己制作IconFont
以及把多个IconFont
中用到的图标整合成一个 Font
也非常不方便TTF
、WOFF
、EOT
以及一个使用SVG
格式定义的字体string
劣势:兼容性(其实目前浏览器兼容性已经不错 查看兼容性)
vite-plugin-svg-icons
插件生成 svg 雪碧图,实现自动引入 <use xlink:href="symbolId"/>
来使用所需的 icon<svgIcon name="home" />
,代码清爽vite.config.ts
文件安装 vite-plugin-svg-icons
插件后编辑 Vite 配置文件:文档
import { createSvgIconsPlugin } from 'vite-plugin-svg-icons'
// 省略其他部分代码
plugins: [
createSvgIconsPlugin({
iconDirs: [path.resolve(process.cwd(), 'src/assets/icons')],
// 图标 ID 样式 dir 代表文件的文件夹名称
symbolId: 'svg-icon-[dir]-[name]',
}),
]
虽然用文件夹来区分已经可以很大程度避免重名问题了,但是也会出现iconDirs
包含多个文件夹,且文件名一样的 svg,这个需要开发者自己规避下。
main.ts
import 'virtual:svg-icons-register'
<template>
<div :class="wrapperColor">
<svg
aria-hidden="true"
:width="width || size"
:height="height || size"
:class="className">
<use :xlink:href="symbolId" :fill="color" />
</svg>
</div>
</template>
<script setup lang="ts" name="SvgIcon">
interface Props {
prefix?: string
name?: string
color?: string
size?: number
width?: number
height?: number
className?: string
dir?: string
}
const props = withDefaults(defineProps<Props>(), {
prefix: 'svg-icon',
name: '',
color: '#fff',
size: 16,
width: 16,
height: 16,
className: 'svg-icon',
dir: '',
})
const wrapperColor = computed(() => `text-color-[${props.color}]`)
const symbolId = computed(() => {
return props.dir?.length
? `#${props.prefix}-${props.dir}-${props.name}`
: `#${props.prefix}-${props.name}`
})
</script>
<style lang="scss" scoped>
.svg-icon {
vertical-align: -0.15em;
fill: currentColor;
overflow: hidden;
}
</style>
<svg-icon name="user" color="#2395f1" :size="30"/>
<svg-icon name="action" color="#d9363e" :width="40" :height="30"/>
<div class="text-green-500">
文本
<svg-icon name="robot" dir="timeline" className="pr-10px" @click="test"/>
<svg-icon name="action" color="#d9363e" />
</div>
注意事项: 🚨
fill ="currentColor"
属性的 svg 图片才能实现自定义颜色Figma
中安装 Svg Export 插件,将导出配置中的 Use currentColor as fill
和 Remove all fills
选项打开