svg-icon在項(xiàng)目中的使用

1、通過 https://www.iconfont.cn 下載資源,引入iconfont.js文件

  • icon/index.js
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon' // svg component

import '@/icons/iconFonts/iconfont.js'

Vue.component('svg-icon', SvgIcon)

  • scgIcon組件
<template>
  <svg class="icon" aria-hidden="true" v-on="$listeners">
    <use xlink:href="#icon-user" />
  </svg>
</template>
<script>
export default {
  name: 'svgIcon',
  props: {
    iconClass: {
      type: String,
      required: true,
    },
  },
  computed: {
    iconName() {
      return `#icon-${this.iconClass}`
    },
  },
}
</script>
<style lang="less">
.icon {
  width: 1em;
  height: 1em;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>
  • 使用
<svg-icon icon-class="user"></svg-icon>

2、使用 svg-sprite

接下來我們就要自己來制作 svg-sprite 了。這里要使用到 svg-sprite-loader 這個(gè)神器了, 它是一個(gè) webpack loader ,可以將多個(gè) svg 打包成 svg-sprite

我們來介紹如何在 vue-cli 的基礎(chǔ)上進(jìn)行改造,加入 svg-sprite-loader。

我們發(fā)現(xiàn)vue-cli默認(rèn)情況下會(huì)使用 url-loader 對svg進(jìn)行處理,會(huì)將它放在/img 目錄下,所以這時(shí)候我們引入svg-sprite-loader 會(huì)引發(fā)一些沖突。

//默認(rèn)`vue-cli` 對svg做的處理,正則匹配后綴名為.svg的文件,匹配成功之后使用 url-loader 進(jìn)行處理。
 {
    test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
    loader: 'url-loader',
    options: {
      limit: 10000,
      name: utils.assetsPath('img/[name].[hash:7].[ext]')
    }
}

解決方案有兩種,最簡單的就是你可以將 test 的 svg 去掉,這樣就不會(huì)對svg做處理了,當(dāng)然這樣做是很不友善的。

  • 你不能保證你所有的 svg 都是用來當(dāng)做 icon的,有些真的可能只是用來當(dāng)做圖片資源的。
  • 不能確保你使用的一些第三方類庫會(huì)使用到 svg。

所以最安全合理的做法是使用 webpack 的 excludeinclude ,讓svg-sprite-loader只處理你指定文件夾下面的 svg,url-loaer只處理除此文件夾之外的所以 svg,這樣就完美解決了之前沖突的問題。 代碼如下

    // set svg-sprite-loader
    config.module
      .rule('svg')
      .exclude.add(resolve('src/icons'))
      .end()
    config.module
      .rule('icons')
      .test(/\.svg$/)
      .include.add(resolve('src/icons'))
      .end()
      .use('svg-sprite-loader')
      .loader('svg-sprite-loader')
      .options({
        symbolId: 'icon-[name]'
      })
      .end()

這樣配置好了,只要引入svg之后填寫類名就可以了

import '@/src/icons/qq.svg; //引入圖標(biāo)

<svg><use xlink:href="#qq" /></svg>  //使用圖標(biāo)
  • 自動(dòng)導(dǎo)入
const requireAll = requireContext => requireContext.keys().map(requireContext)
const req = require.context('./svg', false, /\.svg$/)
requireAll(req)

參考https://juejin.cn/post/6844903517564436493

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 網(wǎng)頁圖標(biāo)展示方式大概可以分為以下幾類 img 標(biāo)簽。最原始的方式,不支持改變顏色 css sprites。其...
    雨翼195閱讀 2,161評論 0 1
  • ?? 之前大部分 icon 是png圖片,當(dāng)有兩種狀態(tài)時(shí)就需要兩種圖片的替換,占用的體積也是比較大的,后來接觸到了...
    前端新陽閱讀 9,631評論 2 14
  • 前言 在做前端后臺(tái)項(xiàng)目的時(shí)候經(jīng)常會(huì)用到很多 icon 圖標(biāo),剛開始還好,但隨著項(xiàng)目的不斷迭代,每次修改添加圖標(biāo)會(huì)變...
    張先覺閱讀 863評論 0 0
  • 今天在vue3+vite項(xiàng)目練習(xí)中,在使用svg時(shí),發(fā)現(xiàn)之前的寫法不能用,之前的使用方法參考:vue2中優(yōu)雅的使用...
    azi__閱讀 6,002評論 2 9
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月,有人笑有人哭,有人歡樂有人憂愁,有人驚喜有人失落,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,814評論 28 54

友情鏈接更多精彩內(nèi)容