欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

VUE之使用svg图标

程序员文章站 2024-02-14 23:54:58
...

在使用矢量图标时,以往都是去网站下载png格式,或者添加unicode格式
现在在vue中,我们以组件的形式加入,跟优雅的使用矢量图标
先给一张效果图
VUE之使用svg图标

一 安装依赖

在vue中首先需要安装可以加载svg的依赖

  1. npm
    npm install svg-sprite-loader --save-dev
  2. yarn
    yarn add svg-sprite-loader ---dev

如果 出现错误可以适当降低依赖版本

二:配置webpack

2.1 首先创建一个svg文件用来保存图标

VUE之使用svg图标

2.2 配置build文件夹中的webpack.base.conf.js

  1. 在图片规则中加入exclude: [resolve('src/assets/icons')]
    排除此文件中的svg图标
    VUE之使用svg图标

由于vue-cli默认情况下会使用 url-loader 对svg进行处理,会将它放在/img 目录下,所以这时候我们引入svg-sprite-loader 会引发一些冲突。我们可以使用exclude: [resolve(‘src/assets/icons’)],让url-loader只处理除此文件夹之外的svg。

  1. 加入加载svg规则
    {
      test: /\.svg$/,
      loader: 'svg-sprite-loader',
      include: [resolve('src/assets/icons')],
      options: {
        symbolId: 'icon-[name]'
      }
    },
    

三 配置svg组件

3.1. 在src/components下新建文件夹及文件SvgIcon/index.vue

VUE之使用svg图标

3.2. index.vue内容

```js
<template>
  <div v-if="isExternal" :style="styleExternalIcon" class="svg-external-icon svg-icon" v-on="$listeners" />
  <svg v-else :class="svgClass" aria-hidden="true" v-on="$listeners">
    <use :href="iconName" />
  </svg>
</template>

<script>
// 提示vue中驼峰命名会自动识别为icon-class格式
// 使用方式
// <!-- icon-class 为 icon 的名字; class-name 为 icon 自定义 class-->
export default {
  name: 'SvgIcon',
  props: {
    iconClass: {
      type: String,
      required: true
    },
    className: {
      type: String,
      default: ''
    }
  },
  computed: {
    isExternal () { // 检测是否是外链的形式引入 svg
      return /^(https?:|mailto:|tel:)/.test(this.iconClass)
    },
    iconName () {
      return `#icon-${this.iconClass}`
    },
    svgClass () {
      if (this.className) {
        return 'svg-icon ' + this.className
      } else {
        return 'svg-icon'
      }
    },
    styleExternalIcon () {
      return {
        mask: `url(${this.iconClass}) no-repeat 50% 50%`,
        '-webkit-mask': `url(${this.iconClass}) no-repeat 50% 50%`
      }
    }
  }
}
</script>

<style scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor; //  默认会读取其父级的 color 
  overflow: hidden;
}

.svg-external-icon {
  background-color: currentColor; //  默认会读取其父级的 color 
  mask-size: cover!important;
  display: inline-block;
}
</style>
```

3.2 注册svg组件

在svg同级目录下新建index.js文件
VUE之使用svg图标

import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component

// register globally
Vue.component('svg-icon', SvgIcon)
// 使用webpack的require.context自动引入src/assets/icons/svg下面所有的图标
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)

3.3 引入注册文件到main.js

全局使用

import './assets/icons' // icon

svg配置完成

四 使用方式

默认在 @/assets/icons 中注册到全局中,可以在项目中任意地方使用。所以图标均可在 @/assets/icons/svg。可自行添加或者删除图标,所以图标都会被自动导入,无需手动操作。

  1. 使用
    !-- icon-class 为 icon 的名字; class-name 为 icon 自定义 class-->
    <svg-icon icon-class="password"  class-name='custom-class' />
    
  2. 改变颜色

    svg-icon 默认会读取其父级的 color fill: currentColor;
    你可以改变父级的color或者直接改变fill的颜色即可。

  3. 使用外链
    支持使用外链的形式引入 svg。例如:

    <svg-icon icon-class="https://xxxx.svg />

  4. 大小
    这里图标默认使用的都是 128*128 大小规格的,可自行根据情况修改
    但大小最后统一
    最后附图
    VUE之使用svg图标
相关标签: VUE vue.js