项目中的精致小图一般都是使用的矢量图,矢量图比位图的优势在于:小,不失真,轻松改变颜色和大小等。
完整项目地址:https://github.com/intomylife/osc-front
v1.4.2 标签地址:https://github.com/intomylife/osc-front/releases/tag/v1.4.2
v1.4.2 下载地址:zip,tar.gz
注:对于标签的说明「初学者商城」- 写在最前面 #5.1
注:查看更改内容:icon 矢量图
注:Iconfont-阿里巴巴矢量图标库:https://www.iconfont.cn/
Unicode
与Font class
用法很类似,都需要先引入图标库,然后根据特定的字符串如(Unicode)
/icon-gouwuche(Font class)
来显示对应的图标,可以看出Font class
是在Unicode
的基础上进一步封装而成的。
Symbol
则比Font class
更加深入人心,图标是静态方式引入,并且还支持多种颜色。下面都是以Symbol
方式使用矢量图。
iconfont.js
iconfont.js
文件拷贝到项目的@/src/assets/
目录下HelloWorld.vue
script
中引入刚刚拷贝的iconfont.js
文件import '@/assets/iconfont'
icon-gouwuche
更改为你自己添加的图标名称代码<!-- 矢量图 -->
<svg class="icon" aria-hidden="true">
<use xlink:href="#icon-gouwuche" />
</svg>
npm run dev
启动项目,访问http://localhost:9527
,显示图标注:vue
的核心思想之一:组件化
vue
的组件都是放在了统一的地方:@/src/components/
目录xlink:href
的值不一样,所以只需要动态的传入图标名称就可以<template>
<svg :class="svgClass" aria-hidden="true">
<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
中注册组件// svg组件
import SvgIcon from '@/components/SvgIcon'
// register globally
Vue.component('svg-icon', SvgIcon)
<!-- 矢量图 -->
<svg-icon icon-class="gouwuche" />
痛点: 虽然iconfont.js
文件是静态引入,但是每次增改图标都得替换整个iconfont.js
文件,更可怕的是,如果前同事离职,你接手了这个项目而且还没加入到图标库的成员中,那将会非常难受。
分开引入svg
解决了什么: 首先自己增改图标变得容易,因为需要哪个图标就只引入哪个图标,每个图标文件是单独存在的。其次,当另一个人接手项目时,也是同样的方便,之前开发时添加的图标很容易维护。
分开引入svg
又有哪些新的问题: ① 前面使用的iconfont.js
文件虽然有种种不便,但是拿来就可以直接使用里面的图标,因为iconfont.js
文件已经生成了svg-sprite
;而分开引入的svg
则需要svg-sprite-loader
插件帮我们生成svg-sprite
。 ② 前面使用的iconfont.js
文件引入一次就可以使用全部的图标;而分开的svg
则需要每个都单独引入一次。
如何下载分开的svg
: 在图标管理我的项目页面,鼠标悬浮到图标上方,点击下载图标
按钮;然后再点击SVG 下载
按钮。
svg-sprite-loader
是webpack
工具svg-sprite-loader
把分开引入的svg
打包成svg-sprite
webpack
中原本就有url-loader
来处理svg
,所以现在指定svg-sprite-loader
来处理svg
的同时还要在url-loader
中排除svg
的处理,当然不是全部,只是分开引入svg
的目录webpack.base.conf.js:
...
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [resolve('src/icons')],
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
...
使用require.context
正则匹配批量的方式直接引入所有svg
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
#3.3
中封装的组件放在了@/src/components/SvgIcon
目录中.
├── src
...
│ ├── components
│ │ ├── HelloWorld.vue
│ │ └── SvgIcon
│ │ └── index.vue
...
svg
组件,正则匹配批量引入svg
操作都写在了一个js
文件中import Vue from 'vue'
// svg组件
import SvgIcon from '@/components/SvgIcon'
// register globally
Vue.component('svg-icon', SvgIcon)
const req = require.context('./svg', false, /\.svg$/)
const requireAll = requireContext => requireContext.keys().map(requireContext)
requireAll(req)
svg
放在了@/src/icons/svg
目录中,对应#3.4.1
中使用svg-sprite-loader
处理svg
时指定的目录include: [resolve('src/icons')]
,同样也是url-loader
排除的目录exclude: [resolve('src/icons')]
.
├── src
...
│ ├── icons
│ │ ├── index.js
│ │ └── svg
│ │ ├── gouwuche.svg
│ │ └── wuliuche.svg
...
main.js
中引入// icon
import '@/icons'
v1.4.2
标签的代码或者对照本篇博客更改v1.4.1
标签的代码vsCode
中打开终端(快捷键:ctrl
+~
)v1.4.1
基础上做更改,还需安装svg-sprite-loader
依赖npm install svg-sprite-loader --save-dev
v1.4.2
标签的代码,则先安装依赖npm install
npm run dev
,回车http://localhost:9527
正确的使用矢量图,为项目添彩。阿,快乐。
希望能够帮助到你
over