vue 项目种使用svg图标

一般常用的代码写法:

<svg-icon class-name="size-icon" icon-class="size"/>

svg 图标可以随字体一样变色、大小可更改且不失真;应用在项目中不仅可以摆脱img图片占用内存大的问题,还可以减少代码量,优化系统。
使用字体图标的步骤如下:

1、安装svg-sprite-loader插件

npm install svg-sprite-loader

 
2、自定义svg-icon组件
componets文件夹下建立一个svgIcon组件,内容如下:


<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 :xlink:href="iconName" />
  </svg>
</template>

<script>
import { isExternal } from '@/utils/validate'

export default {
  name: 'SvgIcon',
  props: {
    iconClass: {
      type: String,
      required: true
    },
    className: {
      type: String,
      default: ''
    }
  },
  computed: {
    isExternal() {
      return isExternal(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 lang="less" scoped>
.svg-icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}

.svg-external-icon {
  background-color: currentColor;
  mask-size: cover!important;
  display: inline-block;
}
</style>

3、 src目录下新建文件夹icons放置svg图标文件,并在index.js中注册svgIcon为全局组件
建目录如下:svg图标及index.js

 index.js文件代码

import Vue from 'vue'
// 引入svgIcon组件
import SvgIcon from '@/components/svgIcon'// svg component

// register globally
// 注册为全局组件
Vue.component('svg-icon', SvgIcon)

// 引入当前svg目录下的文件、不遍历子目录、匹配以'.svg'为结尾的文件
const req = require.context('./svg', false, /\.svg$/)

// 相当于 req.keys().forEach(key => req(key)), req.keys()是匹配到的svg文件的路径数组
const requireAll = requireContext => requireContext.keys().map(requireContext)

// 得到一个完整解析的module数组
requireAll(req)

4、 配置vue.config.js

const path = require('path');
// 在vue.config.js中没有配置 resolve 方法, 需要自定义一个
function resolve(dir) {
  return path.join(__dirname, dir);
}

module.exports = {
  devServer: {
    host: 'localhost',            // 启动时使⽤的域名
    port: 8080,                 // 指定端⼝号 
  },
  chainWebpack: (config) => {
    // set svg-sprite-loader
    config.module.rules.delete('svg'); // 重点:删除默认配置中处理svg
    config.module
      .rule('svg-sprite-loader')
      .test(/\.svg$/)
      .include
      .add(resolve('src/icons')) // 处理svg目录
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]',
      });
  },
}

5、在main.js 里面引入 本队svg图标库

import './icons' // svgIcons

 6、  在页面中使用svg图标

<svg-icon icon-class="password" />

7、页面效果如下:

  

全部代码在github: https://github.com/nyy-2017/vue-svgicon

 最后为了方便大家的沟通与交流请加QQ群: 625787746

请进QQ群交流:【IT博客技术分享群①】:正在跳转

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IT博客技术分享

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值