本文基于vue-cli 与基于webpack的项目配置相似
使用svg-sprite-loader把svg文件封装 通过<use xlink:href="#xx"/>
使用svg图标
使用svgtofont把svg文件转为eot ttf woff woff2 通过class使用font
本文代码地址 https://gitee.com/tothis/vue-record/blob/master/client
- svg图标支持彩色 但不支持css直接修改颜色 css亲和性低
可通过滤镜和偏移修改颜色
filter: drop-shadow(80px 0 white);
transform: translateX(-80px);
- css字体不支持彩色 支持css直接修改颜色 css亲和性高 浏览器兼容性好
- 安装
yarn add svg-sprite-loader svgtofont -D
- 配置svg加载器
配置vue.config.js
const path = require('path')
function resolve(dir) {
return path.join(__dirname, '.', dir)
}
// https://cli.vuejs.org/zh/config
module.exports = {
// https://cli.vuejs.org/zh/guide/webpack.html
chainWebpack: config => {
// 让其他svg loader不对src/assets/icon进行操作
config.module
.rule('svg')
.exclude.add(resolve('src/assets/icon'))
.end()
// 使用svg-sprite-loader对src/assets/icon下的svg进行操作
config.module
.rule('icon')
.test(/\.svg$/)
.include.add(resolve('src/assets/icon'))
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
// 定义规则 <svg class="icon"><use xlink:href="#icon-svg文件名"></use></svg>
.options({
symbolId: 'icon-[name]'
})
.end()
}
}
svg文件放在src\assets\icon
目录下 在改目录下创建index.js
import Vue from 'vue'
const requireAll = requireContext => requireContext.keys().map(requireContext)
// 指定svg文件
const r = require.context('./', false, /.svg$/)
requireAll(r)
// 在src/main.js中引入此文件
// import '@/assets/icon'
- 配置font转化器
配置vue.config.js
// svg转字体
require('svgtofont')({
src: path.resolve(process.cwd(), 'src/assets/icon'), // svg文件目录
dist: path.resolve(process.cwd(), 'src/assets/font'), // 生成文件目录
fontName: 'font', // 生成文件名称和字体名称
css: true // 生成字体文件
}).then(() => {
console.log('生成字体成功')
}).catch(() => {
console.log('生成字体失败')
})
// 建议在.gitignore中加入 src/assets/font
// 在src/main.js中引入字体文件
// import '@/assets/font/font.css'
使用示例
svg
<svg class="svg-icon">
<!-- eye为svg文件名称 -->
<use xlink:href="#icon-eye"/>
</svg>
font
<!-- eye为svg文件名称 -->
<i class="font-eye"/>