随着当前 Web 技术的突飞猛进,网页界面内容愈来愈丰富,让人眼花缭乱,其中就包括了网页中的各类自定义字体。html
例如,我的博客的首页字体:git
CSS3 引入的 @font-face
这一属性能够很好的解决这个问题,能够帮助咱们很是灵活的使用一些特殊的字体,即便用户电脑里面没有安装这个字体,网页也能够显示。github
EOT
字体是 IE 浏览器的首选格式,其余浏览器都不支持;其余浏览器更钟爱常见的 TTF
、SVG
、WOFF
。web
基本语法以下:npm
@font-face { font-family: <自定义一个字体的名称>; src: url('<下载好的字体,在电脑中保存的路径>'); font-variant: <font-variant>; font-stretch: <font-stretch>; font-style: <style>; font-weight: <weight>;
例如:浏览器
@font-face { font-family: 'Lora'; src: url('../fonts/STKaiti.eot'); /* IE9 Compat Modes */ src: url('../fonts/STKaiti.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ url('../fonts/STKaiti.woff2') format('woff2'), /* Super Modern Browsers */ url('../fonts/STKaiti.woff') format('woff'), /* Modern Browsers */ url('../fonts/STKaiti.ttf') format('truetype'), /* Safari, Android, iOS */ url('../fonts/STKaiti.svg#STKaiti') format('svg'); /* Legacy iOS */ font-style: normal; font-weight: normal; } body { font-family: STKaiti; ... }
测试效果:Chrome,Firefox,IE7-IE11 都可以实现bash
自定义中文字体虽炫酷,但有一个弊端,那就是中文字体太大了,很耗费资源,具体的缘由其实很简单:英文只有 26 个字母,一张 ASCII 码表上 128 个字符集几乎能够表示任何英文语句。因为字符集小,字体文件也能够作的很是小;中文字体就彻底不一样,单单 GB2313
编码的中文字符(含符号)就达到 7445 个,字符数量是 ASCII
码表的 58 倍,而字体设计师须要为每个中文字符设计字体,简单计算下,中文字体文件大小也几乎达到英文字体文件的数十倍。微信
解决思路其实也很简单,只在字库中保留页面中出现的文字,将其余大量不用的文字删掉,生成一个只包含特定字符的小字体文件,即可以大大减小字体文件,从而提升访问速度。如今思路有了,那么有没有现成的工具呢?app
还真有。通过我一番搜寻,找到了两款工具:一个是华人开发的「字蛛」,英文名 font-spider
,依赖 Node.js 环境,是一款命令行工具。主要思路是采集线上网页使用到的字体,从字体文件中分离出来,完成大幅度压缩。另外一个是腾讯的大佬改版后的 font-soider,叫 font-spider-plus。它们的工做原理以下:
我选择使用 font-spider-plus,毕竟改版过的,bug 更少,功能更多,还支持线上动态渲染的页面。惟一的不足就是官方文档写的太含糊了,许多人看了根本不知道怎么用。下面我将给我一个详细的范例,手把手教你如何使用 font-spider-plus。
根据官方文档,要想使用 font-spider-plus,首先要在 CSS
文件中经过 @font-face
引入全量大小的特殊字体。具体怎么作呢?并无说,我来告诉你。
首先咱们新建一个文件夹用来放 html 文件:
$ mkdir index
而后在 index 目录中建立一个 index.html
文件,内容以下:
<div class="test"> 米开朗基杨 </div> <style> @font-face { font-family: 'font'; src: url('../fonts/<font>.eot'); src: url('../fonts/<font>.eot?#font-spider') format('embedded-opentype'), url('../fonts/<font>.woff2') format('woff2'), url('../fonts/<font>.woff') format('woff'), url('../fonts/<font>.ttf') format('truetype'), url('../fonts/<font>.svg') format('svg'); font-weight: normal; font-style: normal; } .test{ font-family: 'font'; } </style>
<div class="test"> </div>
中的文字换成你本身的网站的文字。你能够选择将你的博客全部文章内容全选,而后粘贴到此处。fonts
文件夹,而后将 index.html 中的 <font>
换成你下载的字体的前缀。特别说明:
@font-face
中的src
定义的 .ttf 文件必须存在,其他的格式将由工具自动生成
下面是中文字体对应的英文名称:
新细明体:PMingLiU 细明体:MingLiU 标楷体:DFKai-SB 黑体:SimHei 宋体:SimSun 新宋体:NSimSun 仿宋:FangSong 楷体:KaiTi 仿宋_GB2312:FangSong_GB2312 楷体_GB2312:KaiTi_GB2312 微软正黑体:Microsoft JhengHei 微软雅黑体:Microsoft YaHei 装Office会多出来的一些字体: 隶书:LiSu 幼圆:YouYuan 华文细黑:STXihei 华文楷体:STKaiti 华文宋体:STSong 华文中宋:STZhongsong 华文仿宋:STFangsong 方正舒体:FZShuTi 方正姚体:FZYaoti 华文彩云:STCaiyun 华文琥珀:STHupo 华文隶书:STLiti 华文行楷:STXingkai 华文新魏:STXinwei 苹果电脑中的字体: 华文细黑:STHeiti Light [STXihei] 华文黑体:STHeiti 华文楷体:STKaiti 华文宋体:STSong 华文仿宋:STFangsong 丽黑 Pro:LiHei Pro Medium 丽宋 Pro:LiSong Pro Light 标楷体:BiauKai 苹果丽中黑:Apple LiGothic Medium 苹果丽细宋:Apple LiSung Light
而后执行下面的命令来压缩本地 WebFont:
$ fsp local index/index.html
哦对了,你须要先经过 npm 安装 fsp 命令:
$ npm i font-spider-plus -g
压缩完成后,就会在 fonts 目录下生成压缩后的字体文件:
$ ll fonts/ total 41328 -rw-rw-rw- 1 cnsgyg staff 7.7K 11 21 01:08 STKaiti.eot -rw-rw-rw- 1 cnsgyg staff 8.2K 11 21 01:08 STKaiti.svg -rw-rw-rw- 1 cnsgyg staff 7.6K 11 21 01:08 STKaiti.ttf -rw-rw-rw- 1 cnsgyg staff 7.7K 11 21 01:08 STKaiti.woff -rw-rw-rw- 1 cnsgyg staff 3.9K 11 21 01:08 STKaiti.woff2
压缩以前的字体文件会被移到 fonts
目录下的 .font-spider
目录:
$ ll fonts/.font-spider total 24880 -rw-rw-rw- 1 cnsgyg staff 12M 11 21 01:08 STKaiti.ttf
如今字体压缩完了,怎么应用到本身的网站中呢?也很简单,先写个 CSS 经过 @font-faxe
引入压缩后的字体,格式与第一步中的 index.html 相似:
/* fonts-zh.css */ @font-face { font-family: 'font'; src: url('../fonts/<font>.eot'); src: url('../fonts/<font>.eot?#font-spider') format('embedded-opentype'), url('../fonts/<font>.woff2') format('woff2'), url('../fonts/<font>.woff') format('woff'), url('../fonts/<font>.ttf') format('truetype'), url('../fonts/<font>.svg') format('svg'); font-weight: normal; font-style: normal; }
这样还不行,你还须要将压缩后的字体文件拷贝你的网站中,CSS 中经过相对路径要能找到这些字体文件。可我不想这么作,太麻烦了,我还想更简单点。
灵机一动,想到了 base64,编码以后能够不用拷贝这些字体文件,还能减小网站字体的加载体积,真是一举两得啊!具体的步骤我就不解释了,直接把全部步骤放到脚本中:
#!/bin/bash font=STKaiti eot=$(cat fonts/$font.eot|base64|tr -d '\n') woff=$(cat fonts/$font.woff|base64|tr -d '\n') woff2=$(cat fonts/$font.woff2|base64|tr -d '\n') ttf=$(cat fonts/$font.ttf|base64|tr -d '\n') svg=$(cat fonts/$font.svg|base64|tr -d '\n') cat > fonts-zh.css <<EOF @font-face { font-family: '$font'; src: url(data:application/font-eot;charset=utf-8;base64,$eot) format('eot'); font-weight: normal; font-style: normal; } @font-face { font-family: '$font'; src: url(data:application/font-woff2;charset=utf-8;base64,$woff2) format('woff2'), url(data:application/font-woff;charset=utf-8;base64,$woff) format('woff'), url(data:application/font-ttf;charset=utf-8;base64,$ttf) format('truetype'), url(data:application/font-svg;charset=utf-8;base64,$svg) format('svg'); font-weight: normal; font-style: normal; } EOF
执行完上面的脚本后,就生成了一个 fonts-zh.css
,这是咱们惟一须要的东西,再也不须要任何额外的文件。
最后一步就是在你的网站中引入该 CSS,具体的作法大同小异,以 hugo 为例,先将 fonts-zh.css
复制到网站主题目录的 static/css/
目录下,而后在 <head></head>
中引入该 css,以 beatifulhugo 主题为例,直接在 layouts/partials/head_custom.html
中加上下面一行:
<link rel="stylesheet" href="{{ "css/fonts-zh.css" | absURL }}" />
最后让网站的 body 使用该中文字体,具体的作法是修改 body 的 css,以 hugo 的 beatifulhugo 主题为例,修改 static/css/main.css
中的 body 属性:
body { font-family: STKaiti; ... }
能够再加上备用字体,例如:
body { font-family: STKaiti,Cambria; ... }
表示若是 STKaiti
字体不可用,将使用 Cambria
字体。到这里就大功告成了,具体的效果能够参考个人网站:https://fuckcloudnative.io/。
若是你没有强迫症,到这一步就大功告成了,可我还以为不够简单,那么多步骤实在是太繁琐了,我要让它们所有自动化,把全部的步骤放到一个自动化脚本中。这还不够,为了造福大众,我在 GitHUb 中新建了一个仓库,全部的脚本和步骤都在上面,有需求的小伙伴能够拿去 happy 啦~~
项目地址:https://github.com/yangchuansheng/font-spider-plus
扫一扫下面的二维码关注微信公众号,在公众号中回复◉加群◉便可加入咱们的云原生交流群,和孙宏亮、张馆长、阳明等大佬一块儿探讨云原生技术