原文网址:Vue--整合SVG Icon图标--方法/实例_IT利刃出鞘的博客-CSDN博客
说明
本文介绍Vue如何整合SVG图标。
前端图标的发展
从上到下是从古至今的顺序
SVG的好处
可以轻松地按比例放大和缩小图标。SVG图标是矢量图,具有优于位图图形的优点,即按比例放大或缩小时它们仍然看起来不错。而位图图形在按比例放大时趋于像素化,而在按比例缩小时会失去质量(像素)。
见:@vue/cli4--使用图形化界面创建项目--方法/实例_IT利刃出鞘的博客-CSDN博客_vuecli图形化界面
npm install svg-sprite-loader -D
在项目 src 目录下新建 src/icons/svg 目录(存放 svg 图标文件)。
在 src/icons 下创建 icons 目录的入口文件 index.js ,负责svg文件的加载
- import Vue from 'vue'
- import SvgIcon from '@/components/SvgIcon'
- Vue.component('svg-icon', SvgIcon)
-
- /**
- * require.context 的参数说明
- * './svg' 代表要查找的文件路径
- * false 代表是否查找子目录
- * /\.svg$/ 代表要匹配文件的正则
- *
- */
- const svg = require.context('./svg', false, /\.svg$/)
- const requireAll = (requireContext) =>
- requireContext.keys().map(requireContext)
- requireAll(svg)
在vue.config.js中添加如下配置:
- 'use strict'
-
- const path = require('path')
- const resolve = dir => path.join(__dirname, dir)
-
- module.exports = {
- chainWebpack (config) {
- // 配置 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()
- }
- }
在src/components下创建SvgIcon.vue
(或者:在src/components下创建SvgIcon文件夹,在里边创建index.vue)
内容如下:
- <template>
- <svg className="svg-icon" aria-hidden="true">
- <use :xlink:href="iconName"/>
- svg>
- template>
- <style>
- .svg-icon {
- width: 1.5em;
- height: 1.5em;
- }
- style>
- <script>
- export default {
- props: {
- iconClass: {
- type: String,
- required: true
- }
- },
- computed: {
- iconName () {
- return `#icon-${this.iconClass}`
- }
- }
- }
- script>
在 main.js 入口文件中 全局引入 icons:
import './icons'
去 iconfont 图标网站下载个svg图标。
将下载的 svg 图标放置到 src/icons/svg 目录下。这里我下载的是一个搜索图标。
新建components/Parent.vue
- <template>
- <div>
- <div>
- 这是Parent。
- div>
- <svg-icon icon-class="search">svg-icon>
- div>
- template>
-
- <script>
- export default {
- name: 'Parent'
- }
- script>
-
- <style scoped>
-
- style>
修改router/index.js
- import Vue from 'vue'
- import VueRouter from 'vue-router'
- import Parent from '../components/Parent'
-
- Vue.use(VueRouter)
-
- const routes = [
- {
- path: '/',
- name: 'Parent',
- component: Parent
- }
- ]
-
- const router = new VueRouter({
- routes
- })
-
- export default router
结果:
我们从iconfont下载的svg图标已经比较精简了,但里边还是有些无用信息(比如注释)。而且,如果svg图标是从设计那里拿到的,可能会不够精简,这时可以使用svgo来进行压缩。
见:SVGO--使用/实例_IT利刃出鞘的博客-CSDN博客
SVG 使用教程:如何在 Vue 中使用 SVG icon 图标系统 - 卡拉云