【SVG】Vue項(xiàng)目中使用SVG作為圖標(biāo)的組件(svg-sprite-loader)

本文目標(biāo)

在Vue的前端項(xiàng)目開發(fā)中既琴,我們?cè)诤芏嗟胤蕉紩?huì)使用到圖標(biāo),而當(dāng)前SVG格式的圖標(biāo)被越來(lái)越多的采用泡嘴。

在開發(fā)中甫恩,我們一般需要將SVG的圖片存放到特定位置,然后再進(jìn)行調(diào)用酌予。需要有一套有效的方式對(duì)SVG進(jìn)行存儲(chǔ)和調(diào)用磺箕。本文的主要目的就是介紹這套方法。預(yù)期可以幫助您實(shí)現(xiàn)以下開發(fā)需求:

1. 將下載下來(lái)的SVG格式圖標(biāo)存放到特定目錄抛虫;
2. 在VUE中進(jìn)行調(diào)用松靡;
3. 可以對(duì)icon進(jìn)行配置;

為什么會(huì)采用SVG作為圖標(biāo)格式建椰?

1. 為了能兼容電腦雕欺、手機(jī),同時(shí)面對(duì)各種瀏覽器的分辨率棉姐,傳統(tǒng)的圖標(biāo)早已經(jīng)無(wú)法滿足設(shè)計(jì)需求屠列。SVG矢量圖完美的解決了這一點(diǎn)。
2. SVG的圖標(biāo)資源非常的豐富而且靈活谅海,請(qǐng)參見文章《常用的免費(fèi)SVG資源地址》

實(shí)際效果

image

安裝及配置方法

一脸哀、安裝組件svg-sprite-loader

npm install svg-sprite-loader --save-dev

二、在src/components下新建文件夾及文件SvgIcon/index.vue扭吁,index.vue中內(nèi)容如下

<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>

三、在src下新建icons文件夾盲镶,及icons文件夾下svg文件夾侥袜、index.js文件, index.js文件內(nèi)容如下

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)

四溉贿、在main.js中引入svg

 import './icons'

五枫吧、修改根目錄的vue.config.js(主要是為打包進(jìn)行設(shè)置)

module.exports = {
  chainWebpack: config => {
    config.plugin("define").tap(args => {
      const argv = process.argv;
      const icourt = argv[argv.indexOf("--icourt-mode") + 1];

      args[0]["process.env"].MODE = `"${icourt}"`;

      return args;
    });

    // svg rule loader
    const svgRule = config.module.rule("svg"); // 找到svg-loader
    svgRule.uses.clear(); // 清除已有的loader, 如果不這樣做會(huì)添加在此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]"
      });

    // 修改images loader 添加svg處理
    const imagesRule = config.module.rule("images");
    imagesRule.exclude.add(resolve("src/icons"));
    config.module.rule("images").test(/\.(png|jpe?g|gif|svg)(\?.*)?$/);
  },

  devServer: {
    host: "0.0.0.0",
    port: 8081,
    proxy: {
      // 配置跨域
      "/api": {
        target: "http://127.0.0.1:7001",
        ws: true,
        changOrigin: true,
        pathRewrite: {
          "^/api": "/"
        }
      }
    }
  }
};

現(xiàn)在就可以正式使用

1、下載SVG文件宇色,然后將svg文件放置到src/icons/svg

2九杂、在頁(yè)面具體要使用的地方進(jìn)行應(yīng)用颁湖,方式如下:

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

your-icon是保存在src/icons/svg下面的icon文件名稱。比如可以修改為home, check, cart, back等

3例隆、svg最大的特點(diǎn)是矢量甥捺,也是為什么我們會(huì)選擇svg的原因,所以一定會(huì)有對(duì)svg進(jìn)行自定義的情況镀层。此時(shí)镰禾,您只需要在對(duì)應(yīng)vue文件中寫代樣式即可

<svg-icon icon-class="more" class-name="moreIcon "/>
<style lang="scss" scoped>
.moreIcon {
  width: 20px;
  height: 20px;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>

具體案例

1. 目標(biāo)效果

2. 分析

這個(gè)地方是作為標(biāo)簽使用,icon是需要縮小的唱逢,所以需要自定義icon的樣式吴侦,同時(shí)需要對(duì)svg進(jìn)行自定義顏色

3. 代碼

 <span style="font-size:0px;">
        <i class="inline-block text-jpcolor-500">
            <svg-icon icon-class="check" class-name="serviceIcon"/>
        </i>
        <span class="inline-block relative" style="padding-left:2px;font-size:12px;top:-1px;">免費(fèi)送貨</span>
</span>
<style lang="scss" scoped>
.serviceIcon {
  width: 11px;
  height: 11px;
  vertical-align: -0.15em;
  fill: currentColor;
  overflow: hidden;
}
</style>

4. 注:svg有的時(shí)候并不是符合需求,在縮小以后總會(huì)出現(xiàn)差強(qiáng)人意的地方坞古,但基本上可以滿足95%以上的使用需求备韧。

如圖:


這個(gè)時(shí)候就要多一些耐心去找更適合的svg樣式,或者是自己修改svg(不在此文范疇)痪枫。

[本文到底啦]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末盯蝴,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子听怕,更是在濱河造成了極大的恐慌捧挺,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尿瞭,死亡現(xiàn)場(chǎng)離奇詭異闽烙,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)声搁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門黑竞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人疏旨,你說我怎么就攤上這事很魂。” “怎么了檐涝?”我有些...
    開封第一講書人閱讀 152,671評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵遏匆,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我谁榜,道長(zhǎng)幅聘,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評(píng)論 1 279
  • 正文 為了忘掉前任窃植,我火速辦了婚禮帝蒿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘巷怜。我一直安慰自己葛超,他們只是感情好暴氏,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,253評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著绣张,像睡著了一般答渔。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胖替,一...
    開封第一講書人閱讀 49,031評(píng)論 1 285
  • 那天研儒,我揣著相機(jī)與錄音,去河邊找鬼独令。 笑死端朵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的燃箭。 我是一名探鬼主播冲呢,決...
    沈念sama閱讀 38,340評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼招狸!你這毒婦竟也來(lái)了敬拓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,973評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤裙戏,失蹤者是張志新(化名)和其女友劉穎乘凸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體累榜,經(jīng)...
    沈念sama閱讀 43,466評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡营勤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,937評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了壹罚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葛作。...
    茶點(diǎn)故事閱讀 38,039評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖猖凛,靈堂內(nèi)的尸體忽然破棺而出赂蠢,到底是詐尸還是另有隱情,我是刑警寧澤辨泳,帶...
    沈念sama閱讀 33,701評(píng)論 4 323
  • 正文 年R本政府宣布虱岂,位于F島的核電站,受9級(jí)特大地震影響漠吻,放射性物質(zhì)發(fā)生泄漏量瓜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,254評(píng)論 3 307
  • 文/蒙蒙 一途乃、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧扔傅,春花似錦耍共、人聲如沸烫饼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)杠纵。三九已至,卻和暖如春钩骇,著一層夾襖步出監(jiān)牢的瞬間比藻,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工倘屹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留银亲,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,497評(píng)論 2 354
  • 正文 我出身青樓纽匙,卻偏偏與公主長(zhǎng)得像务蝠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子烛缔,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,786評(píng)論 2 345