本文已参与「新人创作礼」活动,一起开启掘金创作之路。
封装自己的web字体图标库Jack Lee 的 个人博客
邮箱 :291148484@163.com
作者主页
掘金 主页:juejin.cn/user/113073…
CSDN 主页:blog.csdn.net/qq_28550263…
原文地址:blog.csdn.net/qq_28550263…(此页面为副本,如部分图片无法显示请参考我的原文)
相关文章推荐:
目 录
1. 字体图标简介
1.1 什么是字体图标
所谓字体图标指的是一种使用字体的编码规则来编码的图形,因此从本质上看其实与其叫做 字体图标还不如叫做 图标字体。图标字体是使用微小图形而不是字母形式的字体。与字符一样,每个图标可以使用 CSS 进行修改大小(font-size)、颜色(color)等等样式。
1.2 字体图的特点
| 特点 | 描述 |
|---|---|
| 灵活 | Web 已针对显示文本进行了优化。轻松更改图标的颜色或应用其他 CSS 效果。Unicode 中有明确的图标和表情符号定义。字体一直是用来表示字母和图标的 |
| 可扩展 | 使用图标字体,更改图标的大小就像更改字体大小一样简单 |
| 矢量 | 字体图标与矢量和分辨率无关。它们在移动和桌面设备上的高和低 PPI 显示器上看起来都不错 |
| 迅速 | 通过将图标设置为字体,您可以使用一个 HTTP 请求加载它们 |
| 无障碍 | 如果操作正确,图标字体可以 100% 访问并与屏幕阅读器兼容 |
| 本地使用 | 通过在您的系统上安装定制的 TTF 字体,您可以在各种不同的设计和编辑应用程序中使用它们 |
2. 绘制或下载矢量图标素材
要制作自己的图标库那么先得有自己的素材。我们的原始素材是SVG格式的矢量图片,它是一种基于基于 XML、由World Wide Web Consortium(W3C)联盟进行开发的矢量图形格式,严格来说应该是一种开放标准的矢量图形语言。能够绘制 SVG 图片的软件有许多
2.1 制合规的作svg图标
2.1.1 使用 Adobe Illustrator 制作
这里介绍使用 Adobe Illustrator 软件来绘制图标矢量文件的流程。 安装打开Adobe Illustrator后


依次点击 对象>轮廓化描边 

2.1.2 使用 Inkscape 制作
2.1.2.1 安装软件
Inkscape是一款自由及开源的矢量图形编辑软件,其功能与Illustrator、Freehand、CorelDraw、Xara X等其他软件相似。与Adobe Illustrator不同的是,可以在Inkscape官网免费下载该软件:inkscape.org/  点击官网 DOWNLOAD 下的 Current Version:  根据你的系统类型下载相应的版本即可。
2.1.2.2 绘制图形
安装完成后启动该软件,新建文件,使用左侧工具栏中的各种工具,绘制你的SVG矢量图形:  绘制后可以通过 编辑 > 设置为页面选取大小 调整为绘制区域的大小: 
2.1.2.2 临摹轮廓
临摹轮廓是一个及其强大的功能,它能使得位图矢量化,如果不适用此功能,之后你的svg图标无法被转换成字体。这和上文中使用 点击Adobe Illustrator 中的 对象>轮廓化描边功能类似。更多关于该功能的介绍推荐阅读博文:inkscape:临摹位图轮廓:blog.csdn.net/ouening/art…  完成后将其保存以待使用。
2.1.3 使用 microsoft Visio 制作
microsoft Visio 是一款强大的绘图工具,使用它绘制的平面图形多数是可以通过导出 SVG 格式,但是需要通过 Adobe Illustrator 或者 Inkscape 的 轮廓化描边或者 临摹轮廓功能进行处理。


对于很多简单的线性图标,我会选择使用 Microstft Visio 先绘制出图标,在导出 SVG文件,接着交给 Inkscape 以 调整为选取大小,最后 临摹轮廓 得到之后能正常生成字体的 SVG 矢量图。
2.2 从互联网获取现成的svg矢量图片
2.2.1 SvgIcons
SvgIcons 收录了大量免费图片,点击图标按钮即可弹出图标代码。其官网地址为: svgicons.sparkk.fr/。 进入其主页后点击左上角的"Icon Sets": 
选择一个图标集:  进队对应的页面下载素材: 
2.2.2 Ikonate
Ikonate 提供200多个完全可定制的矢量图标,其地址为:ikonate.com/。 进入页面后,可以直接点击Export all Icons导出所有图标: 
也可以选择你心仪的图标后,再点击Export: 
2.2.3 Iconfont-阿里巴巴矢量图标库
Iconfont-阿里巴巴矢量图标库的官方地址为:www.iconfont.cn/。在这个网站你可以直接使用关键字搜索到更多你喜欢的图标,打开网站后,其主页界面如下:  比如在搜索框中输入”购物车“回车提交后进入搜索结果页面:  鼠标移动至某个图标上点击“下载”打开下载子页面:  点击SVG下载即可下载图标。
2.2.4 谷歌图标库
其官方地址为:fonts.google.com/icons?selec…  你可以选择你需要的图标,点击它,在右侧点击下载SVG图标: 
3. 生成字体文件
 


4. 图标字体文件的基本使用
你需要引用生成的CSS文件(style.css):
<link rel="stylesheet" href="https://i.icomoon.io/public/temp/2910d84d51/UntitledProject/style.css">
注意这个CSS样式文件和字体文件所在的目录关系,在该CSS文件中,导入了所使用的字体:
@font-face {
font-family: 'jcicon';
src: url('fonts/jcicon.eot?1kky57');
src: url('fonts/jcicon.eot?1kky57#iefix') format('embedded-opentype'),
url('fonts/jcicon.ttf?1kky57') format('truetype'),
url('fonts/jcicon.woff?1kky57') format('woff'),
url('fonts/jcicon.svg?1kky57#jcicon') format('svg');
font-weight: normal;
font-style: normal;
font-display: block;
}
而我们的字体文件就在这个font目录下面:

5. 将字体图标文件封装成 Vue 组件
简单封装示例
定义图标组件
<template>
<span
:class="[name,{
iconstyle:true,
}]"
v-if="colorVal && sizeVal"
:style="{'color': colorVal}"
></span>
<span
:class="[name,{
iconstyle:true,
}]"
v-else-if="colorVal"
:style="{'color': colorVal}"
></span>
<span
:class="[name,{
iconstyle:true,
}]"
v-else-if="sizeVal"
:style="{'font-size': sizeVal}"
></span>
<span
:class="[name,{
iconstyle:true,
}]"
v-else
></span>
</template>
<script lang="ts">
import {
defineComponent, ref,
} from 'vue';
export default defineComponent({
name: 'my-icon',
props:{
name:{
type:String,
default:'icon-image'
},
size:String,
color: String,
},
setup(props){
let colorVal = undefined;
if(props.size){
colorVal = ref(props.color)
}
let sizeVal = undefined;
if(props.size){
sizeVal = ref(props.size.toString()+'px');
}
return {
colorVal,
sizeVal
}
}
});
</script>
<style lang="scss" scoped>
@import "./style.css";
.iconstyle{
margin: 0;
padding: 0;
}
</style>
全局安装组件:
import IconVue from 'Icon.vue'; // 你组件文件的位置
import type { App, Component } from 'vue';
const components: Component[] = [
IconVue,
// ...其它你想安装的组件
]
export const MyComponents = {
install:(app: App<Element>)=>{
components.forEach(component =>{
app.component((component as any).name, component)
})
}
}
在 main.ts中:
import { createApp } from 'vue'
import App from './App.vue'
import { MyComponents } from './components'; // 上面定 MyComponents 的 ts 文件地址
const app = createApp(App);
app.use(MyComponents);
app.mount('#app');
使用举例:
<template>
<my-icon name="jcicon-toggle-left"></jc-icon>
</template>