Vue 项目引入 SVG 图标

作者 : jamin 本文共2161个字,预计阅读时间需要6分钟 发布时间: 2020-10-18 共1108人阅读

Vue 项目引入 SVG 图标

关于 SVG

SVG 是一种可缩放矢量图形(Scalable Vector Graphics,SVG)是基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。SVG 由 W3C 制定,是一个开放标准。

SVG 在既能满足现有图片的功能的前提下,又是矢量图,在可访问性上面也非常不错,并且有利于 SEO 和无障碍,在性能和维护性方面也比 icon font 要出色许多。

SVG 与 icon font 的区别:

  1. icon font 是字体渲染,而 svg 是图形渲染,icon font 在一倍屏幕下渲染效果不好,细节部分锯齿明显
  2. icon font 因为是字体只能支持单色
  3. icon font 可读性不够好,icon font 主要在页面用 Unicode 符号调用对应的图标,对浏览器和搜索引擎不友好

安装依赖

在 vue 项目中引入 svg,首要工作是安装依赖包 svgo 和 svg-sprite-loader,这两个工具包都是给 webpack 打包 svg 图标资源使用。

  • svgo: Node.js tool for optimizing SVG files.
  • svg-sprite-loader: Webpack loader for creating SVG sprites.
"devDependencies": {
  "svgo": "^1.2.1",
  "svg-sprite-loader": "^4.1.3"
}

然后配置 webpack 对于 svg 文件的 loader,修改 vue.config.js 文件,引入刚刚安装的 svg loader,详情如下:

// vue.config.js
module.exports = {
  chainWebpack: (config) => {
    // svg rule loader
    const svgRule = config.module.rule('svg') // 找到 svg-loader
    svgRule.uses.clear() // 清除已有 loader
    svgRule.exclude.add(/node_modules/) // 排除 node_modules 目录
    svgRule // 添加新的 svg loader
      .test(/\.svg$/)
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]',
      })
  },
}

引入资源

这里举个栗子,新建 src/assets/icons 文件夹,在此文件夹下新建 svg 子文件夹用于存放 svg 图标文件,并新增 svgo 配置文件 svgo.yml,详见官方文档,添加简要配置如下:

# svgo.yml
plugins:
  - removeAttrs:
      attrs:
        - 'fill'
        - 'fill-rule'

在此文件夹下新增 index.js 引入 svg 资源并全局注册 vue 组件,代码如下:

import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon' // svg组件

// register globally
Vue.component('svg-icon', SvgIcon)

const req = require.context('./svg', false, /\.svg$/)
const requireAll = (requireContext) => requireContext.keys().map(requireContext)
requireAll(req)

require.context() 方法来创建自己的(模块)上下文,这个方法有 3 个参数:

  • 要搜索的文件夹目录
  • 是否还应该搜索它的子目录
  • 以及一个匹配文件的正则表达式

创建一个通用的引入图标的 SvgIcon 组件如下:

<template>
  <svg :class="svgClass" aria-hidden="true" v-on="$listeners">
    <use :xlink:href="iconName" />
  </svg>
</template>

<script>
  export default {
    name: 'SvgIcon',
    props: {
      iconClass: {
        type: String,
        required: true,
      },
      className: {
        type: String,
        default: '',
      },
    },
    computed: {
      iconName() {
        return `#icon-${this.iconClass}`
      },
      svgClass() {
        if (this.className) {
          return 'svg-icon ' + this.className
        } else {
          return 'svg-icon'
        }
      },
    },
  }
</script>

<style scoped>
  .svg-icon {
    width: 1em;
    height: 1em;
    vertical-align: -0.15em;
    fill: currentColor;
    overflow: hidden;
  }
</style>

最后不要忘记在 main.js 里引入 icons:

import './assets/icons'

食用方式,添加 svg 文件到 /assets/icons/svg 文件夹下即可,如添加 github.svg 后在 vue 文件里引入:

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

参考文章:
在 vue 项目中优雅的使用 Svg

本站所提供的部分资源来自于网络,版权争议与本站无关,版权归原创者所有!仅限用于学习和研究目的,不得将上述内容资源用于商业或者非法用途,否则,一切后果请用户自负。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源。如果上述内容资对您的版权或者利益造成损害,请提供相应的资质证明,我们将于3个工作日内予以删除。本站不保证所提供下载的资源的准确性、安全性和完整性,源码仅供下载学习之用!如用于商业或者非法用途,与本站无关,一切后果请用户自负!本站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。如有侵权、不妥之处,请联系站长以便删除!
金点网络 » Vue 项目引入 SVG 图标

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
是否提供免费更新服务?
持续更新,永久免费
是否经过安全检测?
安全无毒,放心食用

提供最优质的资源集合

立即加入 友好社区
×