了解SVG-icon的使用流程
Posted 前端小谢
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了了解SVG-icon的使用流程相关的知识,希望对你有一定的参考价值。
一.了解SVG是什么
SVG(Scalable Vector Graphics)可缩放矢量图形,是一种用于描述基于二维的矢量图形的 XML 标记语言,其基本矢量显示对象包括矩形、圆、椭圆、多边形、直线、任意曲线等,还能显示文字对象和嵌入式外部图像(包括 PNG、JPEG、SVG 等)。实际项目中大多数图标都是使用的 SVG 图标文件,其主要有以下几个优点:
1.内容可读,文件是纯粹的 XML。
2.图像文件小,可伸缩性强。
3.矢量放缩,能以不牺牲图像质量为前提,进行任意缩放。
4.还能基于 DOM 模型实现动态和一些交互功能
二.使用svg-icon的配置
- 安装依赖npm i svg-sprite-loader
- 在 vue.config.js进行配置
const path = require('path') function resolve(dir) return path.join(__dirname, dir) // 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()
三.创建src/icons文件夹
- 创建src/icons文件,写入svg和index.js
2.在index.js写入以下代码
import Vue from 'vue'
import SvgIcon from '@/components/SvgIcon'// svg component
// register globally
Vue.component('svg-icon', SvgIcon)
const req = require.context('./svg', false, /\\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
3.可以通过iconfont-阿里巴巴矢量图标库 去下载你要用的svg,复制地址并写入svg中
4. 在components下面新建SvgIcon组件,并对index进行配置
<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 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>
四.其他配置及引入
- 在utils/validate.js配置
export function isExternal(path)
return /^(https?:|mailto:|tel:)/.test(path)
2.在main.js中引入
五.使用
1.使用格式<svg-icon icon-class="文件名"/> 。这里的文件名就是在src/icons/svg下的文件名
vue中封装svg-icon组件并使用
- 新建的vue项目结构
- components文件下新建SvgIcon组件
index.vue文件中代码
<template> <svg :class="svgClass" aria-hidden="true"> <use :xlink:href="iconName"></use> </svg> </template> <script type="text/ecmascript-6"> export default name: 'svg-icon', props: iconClass: type: String, required: true , className: type: String , computed: iconName () return `#icon-$this.iconClass` , svgClass () if (this.className) return 'svg-icon ' + this.className else return 'svg-icon' </script> <style> .svg-icon width: 1em; height: 1em; vertical-align: -0.15em; fill: currentColor; overflow: hidden; </style>
- 将所需svg文件放置icons的svg文件夹下
icons文件下的index.js文件中的代码如下:
import Vue from 'vue' import SvgIcon from '@/components/SvgIcon'// svg组件 // register globally Vue.component('svg-icon', SvgIcon) const requireAll = requireContext => requireContext.keys().map(requireContext) const req = require.context('./svg', false, /\\.svg$/) requireAll(req)
- main.js中引入icons文件
- 安装svg-sprite-loader,并且创建vue.config.js文件
命令:
npm install svg-sprite-loader --save
vue.config.js文件内容如下:
const path = require('path'); function resolve(dir) return path.join(__dirname, '.', dir); module.exports = chainWebpack: config => 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]' );
- 最后直接在组件中使用icon-class为svg名字的图标即可
以上是关于了解SVG-icon的使用流程的主要内容,如果未能解决你的问题,请参考以下文章
vue 使用require.context显示文件夹下所有的svg-icon图标