目前UI交付的设计稿越来越多地使用svg,而不是提供二倍图、双色png了。这里通过配置 vue,来实现引用svg,也支持hover变色。
SVG特点
svg VS 双倍图、双色图(也就是普通状态和选中状态)
其实 icon-font这篇文章已经提到了:
这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇文章 这种用法其实是做了一个svg的集合,与上面两种相比具有如下特点:
- 支持多色图标了,不再受单色限制。
通过一些技巧,支持像字体那样,通过font-size,color来调整样式。
兼容性较差,支持 ie9+,及现代浏览器。
浏览器渲染svg的性能一般,还不如png。
UI通过 sketch 等UI设计工具导出的 svg 也会包含一些 meta冗余信息也需要去除
Vue配置
在vue中配置 svg,需要以下步骤:
1. 安装依赖
npm install svg-sprite-loader svgo svgo-loader -D
分别是:
- svg-sprite-loader 把svg合并成精灵图方便查找svg图片
- svgo 自定义svg,开去除meta fill信息
2. 配置
修改项目中的 vue.config.js :
const svgSpritePlugin = require('svg-sprite-loader/plugin');var config = {chainWebpack(config) {const svgDirectoray = path.resolve(__dirname, 'src/assets/svg');// 忽略svg目录config.module.rule('svg').exclude.add(svgDirectoray);// 补充svg规则config.module.rule('svg-icons').test(/\.svg$/).include.add(svgDirectoray).end().use('svg-sprite-loader').loader('svg-sprite-loader').options({// extract: false,symbolId: '[name]'}).end().use('svgo-loader').loader('svgo-loader').tap(options => ({...options, plugins: [{removeAttrs: {attrs: 'fill'}}]})).end();// 引入插件config.plugin('svg-sprite').use(svgSpritePlugin, [{plainSprite: true}]);}}
辅助注释可以看到:
- 取消对 svg目录的解析
- 补充svg后缀解析,并且移除meta信息
以上准备完毕
// 记得 引入import '@/assets/svg/sad.svg';
<svg fill="red"><use xlink:href='#sad'/></svg>

3. 进一步封装
思路是
- 默认引入 文件夹下所有svg
- 封装 fill 的触发效果
- prop 设置 fill defaultColor hoverColor
