svg icon图标的实现
图标实现的演进 img --> font库 --> iconfont(unicode、font-class、symbol)
创建组件
//component/svg-icon
<template>
<svg class="svg-icon" aria-hidden="true">
<use :href="iconId"></use>
</svg>
</template>
<script>
export default {
props: {
iconClass: {
type: String,
required: true
}
},
computed: {
iconId() {
return `#icon-${this.iconClass}`
}
}
}
</script>
<style>
.svg-icon {
width: 1em;
height: 1em;
vertical-align: -0.15em; /* icon大小与字体一致,字体基线会与标签下边缘对齐,设置一个往下偏移的比列,使得看起来是对齐的*/
fill: currentColor; /*currentColor是一个变量,这个变量的值就表示当前元素的color值,如果当前元素未设置color值,则从父元素继承*/
overflow: hidden;
}
</style>
全局注册组件
可在src目录下新建icons文件夹,再在icons里新建svg文件夹和index.js,前者用来存储svg文件
// icons/index.js
import Vue from 'vue'
import svgIcon from '@/components/svgIcon'
Vue.component('svg-icon', svgIcon)
//自动加载全部svg
// require.context是webpack的方法,下面写法的意思则是根据正则/\.svg$/匹配./svg目录下(不含子目录)符合条件的文件并require
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
//main.js
import '@/icon'
替换默认的loader来处理svg
//vue.config.js
chainWebpack: config => {
const svgRule = config.module.rule('svg')
svgRule.uses.clear()
svgRule
.use('svg-sprite-loader')
.loader('svg-sprite-loader')
.tap(options => {
options = {
symbolId: 'icon-[name]'
}
return options
})
}
// 在代码中使用
<icon-svg icon-class="XXX" />
svg文件还可继续优化 svg精简压缩工具 ,以上就是我的学习笔记啦!!!