日常开发网页经常会使用一些特殊字体,比如思源黑体、苹方字体等,因为这些字体在一般的宿主环境中是不存在的,需要通过 css 的 @font-face
定义,并从服务器中加载对应的字体文件,而字体文件一般都是比较大的,甚至有时候一个字体比其他所有的资源(js、css、图片)加起来还要大,对网页的加载性能起到非常关键的影响,因此有必要对字体进行一些优化。本文主要从字体格式、按需提取、统一渲染三个方面来谈谈优化字体的常用技巧。
现在是 1202 年了,各主流设备基本都支持 woff2 字体格式,因此网站中没有必要再引入多种不同格式的字体了。一般地,建议只引入 woff2 就好了,既可以保持代码的简洁性,又可以减少上传到你服务器的文件,何乐而不为?
可是很多时候美术同学只提供其他格式的字体文件给我们,比如 TTF 或 OTF,那如何将其转换成 woff2 呢?
TTF 字体转 WOFF2
TTF 字体,是苹果和 windows 都支持的一种字体,因此是美术同学最喜欢用的。TTF 转换 WOFF2 是比较简单的,可以选择线上转换,推荐的网站有以下两个
但是个人觉得线上转换等待上传的时间比较久,而且有时候生成的文件是空白的,因此更加倾向于使用 node 库 ttf2woff2[3] 转换。该库的周下载量达到 10w+ 的,可见好多人都会有将 tff 转换成 woff2 的需求。使用方法也很简单:
cat font.ttf | ttf2woff2 > font.woff2
因为使用 了 cat 命令来提取 ttf 的内容,如果你使用的是 windows ,需要使用 git bash 或 wsl 来运行。
OTF 转 WOFF2
除了 TTF ,美术同学还经常提供 OTF 给我们,这是微软和 Adobe 共同研发的字体,因此在 windows 平台还是比较流行的。那如何将其转换成 WOFF2 呢?目前我还没有发现哪个线上网站或 node 库能一步到位转换的,在 google 上搜索好几个线上转换的网站,要么转换完成后无法下载 ,要么转换下载后是个空文件,反正就是不靠谱的东西。
经过一番折腾后,找到了一个不错的 python 库 otf2ttf[4],能够稳定的将 otf 转 ttf。使用方法也比较简单,首先安装 python,然后通过 pip 安装 otf2ttf 就可以使用了(pip 类似于 npm,是 python 的包管理器),不过官方的文档中示例代码应该是有一点小笔误:
otf2ttf MyFont.ttf
里面的 MyFont.ttf 应该是 MyFont.otf 才对,因为这个 input 应该是 OTF 类型而不是 TTF 。
使用 python otf2ttf 生成 ttf 文件 后,就可以使用上面提到的将 ttf 转换成 woff2 的方法获取到 woff2 了。
关于字体转换的这里再啰嗦一下:有时候美术同学还会提供 ttc 文件给我们,这不是单个字体,而是将多种字体打包在一起了,需要从中提取出 ttf 后才能使用,可以尝试使用 TTC2TTF[5]。
一般的,尽管将字体转换成 woff2 格式,最小依然也有好几百 K ,而更多情况下会有 1-4M 左右。有时候,我们只有少数的文字需要用到特殊字体,比如说只有 0-9
这 10 个数字用到某种特殊字体,如果把整个字体文件引入就没有必要了,比切10个图片还要大。好在有一些技术能够将 0-9
这10个数字对应的字体子集提取出来。我平时会使用 font-spider 字蜘[6] 来提取。
首先,全局安装 font-spider:
npm install font-spider -g
然后,新建一个 html 文件,比如文件名为 index.html
,里面用一个元素包含所有的你想要提取的文字,比如 0-9,并为这个元素定义上你想要的特殊字体:
<h1>0123456789</h1>
<style>
@font-face {
font-family: 'sourceHan';
src: url('./SourceHanSansCN-Regular.ttf');
font-weight: normal;
font-style: normal;
}
h1 {
font-family: 'sourceHan';
} </style>
最后,在这个 html 文件所在的目录执行以下命令:
font-spider index.html
这时候,原来的 SourceHanSansCN-Regular.ttf
就会被移动到 .font-spider/
目录下,而原来位置的字体会被替换成只提取了 0-9
的字体文件。这个体积相差了好几个数量级的:
完整的字体文件大小是 10M :
image.png
只提取 0-9
10 个数字的字体文件只有 7K:
image.png
所以,如果你的网站内容是静态不变的,则建议使用 font-spider 将你所要用到的文字提取出来,这将会大大的减少字体文件的体积。
将字体转换成 WOFF2 及静态内容网站使用 font-spider 进行按需压缩,可以很好的控制字体的大小。(PS:WOFF2 字体没有必要再开启 GZIP,因为这个字体文本本身就是压缩过的)。
最后,我们再来看看网络速度对字体内容的影响,假如你的网页全部内容都使用某种字体,CSS 定义如下:
@font-face {
font-family: myfont;
src: url('./myfont.woff2') format('woff2');
}
body {
font-family: myfont;
}
假如这个 myfont.woff2 文件大小为 4M,而网络下载速度只有 1M/s ,则加载这个字体需要 4 秒钟。这4秒期间由于还没有加载完成远程字体,浏览器会使用什么字体渲染呢?事实上,不同的浏览器表现会不一样的,以下是一些常见的桌面浏览器的表现:
我们需要想办法统一这些行为,比较理想的行为是:先使用系统默认字体,等到远程字体加载完成了再替换成特殊字体。借助于 WebFontLoader[7] 可以很容易的实现这一效果。下面来看一下如何使用:
@font-face {
font-family: 'myfont';
src: url('./myfont.woff2') format('woff2');
}
注意,CSS 中只需要定义字体就行,而不要使用使用这个字休。
2 . 然后 引入 webfontloader (也可以通过 npm 安装),将你在 css 中定义的字体名称添加到 custom.families
列表中,并在 active 回调中将该字体添加到对应的元素上,代码如下:
<script src="https://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js"></script>
<script> WebFont.load({
custom: {
families: ['myfont'],
},
classes: false,
active() {
document.body.style.fontFamily = 'myfont';
},
}); </script>
这样浏览器一开始就会使用默认字体渲染内容,等字体加载完成后再使用特殊字体重新渲染。
关于字体优化技巧就先写到这里啦,有问题的欢迎留言交流哈。
[1]https://everythingfonts.com/ttf-to-woff2: https://link.juejin.cn/?target=https%3A%2F%2Feverythingfonts.com%2Fttf-to-woff2
[2]https://www.fontsquirrel.com/tools/webfont-generator: https://link.juejin.cn/?target=https%3A%2F%2Fwww.fontsquirrel.com%2Ftools%2Fwebfont-generator
[3]https://www.npmjs.com/package/ttf2woff2: https://link.juejin.cn/?target=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fttf2woff2
[4]https://github.com/awesometoolbox/otf2ttf: https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fawesometoolbox%2Fotf2ttf
[5]https://www.npmjs.com/package/ttc2ttf: https://link.juejin.cn/?target=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fttc2ttf
[6]https://github.com/aui/font-spider: https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Faui%2Ffont-spider
[7]https://github.com/typekit/webfontloader: https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Ftypekit%2Fwebfontloader
本文由哈喽比特于3年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/a2fFMb-XWzY7ThvGvD5gow
京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。
日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。
据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。
今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。
日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。
近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。
据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。
9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...
9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。
据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。
特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。
据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。
近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。
据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。
9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。
《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。
近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。
社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”
2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。
罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。