icon-fonts解决方案可以一次性加载纯色图标,并且相对于精灵图更小更灵活;那渐变色或者组合颜色的图标怎么办呢,答案之一就是svg
1.svg是矢量图像,可以无限缩放,而且图像质量不会下降
2. svg图像比 jpg 或 png 图像更灵活,我们可以使用 CSS 和 JavaScript 与它们进行交互,比如在 css中用fill属性控制svg颜色
3. svg基本上可以放心使用,除非你要用在IE8或老版本安卓机[^1]**中;
4. SVG Sprite技术,这里所说的Sprite技术就是类似于CSS中的Sprite技术。图标图形整合在一起,实际呈现的时候准确显示特定图标。

实际上就是把所有的当前页面用到的svg使用symbol标签都放在一个svg中加载到body顶部,使用的时候再用use标签的xlink:href=”#xxx”根据symbol的id调用
[^1]: svg的说明
安装依赖
1 | // 读取svg信息,去除svg中的无用标签,精简结构 |
1 | // SVG Sprite插件 |
配置 vue.config.js
1 | const path = require('path') |
在vue脚手架生成的文件夹下的src/components创建一个Svg
1 | <template> |
从vue-cli3基础loader中可以找到这两个loader的默认配置
1 | // 默认的svg loader... |
在src/下创建一个icons目录
svg目录主要用于存放svg文件,来看一下index.js的内容,功能就是把组件注册到全局,方便使用:
1 | import Vue from 'vue' |
在main.js中引入 import ‘./icons’ // icon
如何使用?
- 可以把设计大大给的svg 或者从iconfont官网下载开源的icon的svg格式,复制到src/icons/svg目录 下;
- 点击svg查看源码,修改fill属性, fill=”currentColor”,或者fill=””,如果无此属性,就不用管,这样做是可以让外部控制icon的颜色,或随父元素的color;
- 注意svg命名和SvgIcon命名一致,看一下最终使用:
1
<svg-icon icon-class="go-back"></svg-icon>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15render(h, context) {
const { icon, title } = context.props
const vnodes = []
if (icon&&icon.name) {
if (icon.name.indexOf('icon-')===-1){
vnodes.push(<svg-icon icon-class={icon.name}/>)
}else{
vnodes.push(<i class={icon.name}/>)
}
}
if (title) {
vnodes.push(<span slot='title'>{(title)}</span>)
}
return vnodes
}如何改变SVG的颜色?包括滑过变色选中变色?
1 | <?xml version="1.0" encoding="utf-8"?> |
svg文件里面的格式是这样,但是如果想css更改颜色,一定一定一定要有path 并且 把相关类名的fill属性设置颜色给注释掉,否则不会有效果,重要的话说三遍,三遍,三。。。


