svg学习笔记

149 阅读1分钟

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

chainWebpackconfig => {
    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精简压缩工具 ,以上就是我的学习笔记啦!!!