npm i svg-sprite-loader -D
打开vue.congfig.js
文件,配置chainWebpack
需要在src/assets/svg
新建文件夹,里面存放svg图
chainWebpack: config => {
config.module.rules.delete('svg'); //重点:删除默认配置中处理svg,
config.module
.rule('svg-sprite-loader')
.test(/\.svg$/)
.include.add(resolve('src/assets/svg')) // 表示目录中的文件需要进行 svg-sprite-loader
.end()
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.options({
symbolId: 'icon-[name]'
});
config.module
.rule('images')
.test(/\.(png|jpe?g|gif|webp|svg)(\?.*)?$/)
.exclude.add(resolve('src/assets/svg')) // 表示目录中的文件不要进行 url-loader
.end()
.use('url-loader')
.loader('url-loader')
.options({
limit: 10240, // 设置小于10k的就base64
name: 'img/[name].[hash:7].[ext]',
publicPath: assetsPublicPath
});
},
svgIcon文件夹包含两个文件:svgIcon.vue
和index.js
svgIcon.vue如下
<template>
<svg :class="svgClass" aria-hidden="true">
<use :xlink:href="iconName">use>
svg>
template>
<script>
export default {
name: 'svg-icon',
props: {
iconClass: {
type: String,
required: true
},
className: {
type: String
}
},
computed: {
iconName () {
return `#icon-${
this.iconClass}`;
},
svgClass () {
if (this.className) {
return 'svg-icon ' + this.className;
} else {
return 'svg-icon';
}
}
}
};
script>
<style lang="scss" scoped>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em;
fill: currentColor; //此属性为更改svg颜色属性设置
stroke: currentColor;
overflow: hidden;
}
style>
index.js如下:
import Vue from 'vue';
import SvgIcon from '@/components/svgIcon/svgIcon.vue';
// 全局注册组件
Vue.component('svg-icon', SvgIcon);
// 定义一个加载目录的函数
const requireAll = requireContext => requireContext.keys().map(requireContext);
/**
* require.context是什么?
* 一个webpack的api,通过执行require.context函数获取一个特定的上下文,
* 主要用来实现自动化导入模块,
* 在前端工程中,如果遇到从一个文件夹引入很多模块的情况,
* 可以使用这个api,它会遍历文件夹中的指定文件,
* 然后自动导入,使得不需要每次显式的调用import导入模块
*/
const req = require.context('@/assets/svg', false, /\.svg$/);
// 加载目录下的所有 svg 文件
requireAll(req);
需要在main.js
文件里引用
// 全局注册svg组件
import '@/components/svgIcon';
在svg
文件里添加一张test.svg
图片,iconClass
跟图片名称保持一致,className
可以自己添加类,默认会有一个svg-icon
注意:需要把svg图片文件的(需要修改的)fill以及stroke修改成currentColor
。
比如下面的svg文件就stroke="currentColor"
<svg width="16px" height="14px" viewBox="0 0 16 14" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<g id="test" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round">
<g id="17-test" transform="translate(-1153.000000, -537.000000)" stroke="currentColor">
<g id="icon-test" transform="translate(1154.000000, 538.000000)">
<path d="M14.4576763,0 L6.15140056,0 C5.87525819,-1.94537167e-16 5.65140056,0.223857625 5.65140056,0.5 L5.65140056,5.98362814 C5.65140056,6.25977051 5.42754294,6.48362814 5.15140056,6.48362814 L3,6.48362814 L3,6.48362814" id="路径-4">path>
<path d="M5.48334313,2.84002654 L2.79482046,2.84002654 C2.68270744,2.84002654 2.5738475,2.877706 2.48572375,2.94701353 L0.190903296,4.75184293 C0.0703681963,4.84664132 -1.85064764e-15,4.99150847 -1.77635684e-15,5.14485594 L-1.77635684e-15,10.1645815 C-1.36303406e-15,10.4407239 0.223857625,10.6645815 0.5,10.6645815 L3.10371973,10.6645815 L3.10371973,10.6645815 M6.10371973,10.6645815 L9.30163607,10.6645815 M12.3016361,10.6645815 L14.554688,10.6645815" id="形状">path>
<path d="M6.10371973,10.6645815 L6.10371973,10.8706025 C6.10371973,11.6990296 5.43214685,12.3706025 4.60371973,12.3706025 C3.7752926,12.3706025 3.10371973,11.6990296 3.10371973,10.8706025 L3.10371973,10.6645815" id="路径">path>
<path d="M12.3016361,10.6645815 L12.3016361,10.8706025 C12.3016361,11.6990296 11.6300632,12.3706025 10.8016361,12.3706025 C9.97320895,12.3706025 9.30163607,11.6990296 9.30163607,10.8706025 L9.30163607,10.6645815" id="路径备份">path>
<line x1="9.97537131" y1="5.5" x2="14.4921377" y2="5.5" id="路径-8">line>
g>
g>
g>
svg>
页面使用以及样式修改
<svg-icon iconClass="test" className='test-name'>svg-icon>
.test-name {
width: 14px;
height: 14px;
color: green;
}