#名词
#FontsAPI
提供公益 WebFonts 的端点,称为 FontsAPI ,译为 “字体 API” ,即便 FontsAPI 实际上是纯静态的。
#FontsPKG
提供字体下载功能的端点,称为 FontsPKG ,译为 “字体包” 。
#嵌入字体的方法
ZSFT 中有五大嵌入方法: 常规 CSS 、HTML 强化、HTML 无阻塞、无阻塞.js 和 英文子集化,当然,前四个实际上都是编写好的代码,可以自己实现。
#灾备域
FontsAPI 由 L1 域 fontsapi.zeoseven.com 直接提供并在意外情况时 307 重定向至 L2 域。
L2 域(灾备域) fontsapi-storage.zeoseven.com 会始终启用,也可以在代码中直接使用 L2 域来加载(虽然通常只是用作备用回退加载),虽然 L2 域在过往的稳定性表现极佳,但 L2 域在中国大陆的性能仍待提升。
#常规 CSS
这是最通用也是推荐的方法,任何字体都会提供 “常规 CSS” 选项,可以将它使用在 .css 文件或 HTML 的 <style> 中。
/* 大体积字体,按需加载 */ @import url('https://fontsapi.zeoseven.com/1/main/result.css'); body { font-family: "JinzisheTongfang"; font-weight: normal; } /* 小体积字体,完整字库和冗余 */ @font-face { font-family: "zsft-a"; src: url('https://fontsapi.zeoseven.com/a/main.woff2') format('woff2'), url('https://fontsapi-storage.zeoseven.com/a/main.woff2') format('woff2'); font-display: swap; } body { font-family: "zsft-a"; font-weight: normal; }
通常用于: CSS
需要使用 <style> 包裹的: HTML
优点: 更高的加载优先级,字体被缓存后无闪烁, WebFonts 的标准方法
缺点: 会阻塞 HTML 渲染
提供: 任何字体
#HTML 强化
此选项可以被用在 HTML 或 PHP 中,以标准方法实现预载和冗余措施。
<link rel="preconnect" href="https://fontsapi.zeoseven.com" crossorigin /> <link rel="stylesheet" href="https://fontsapi.zeoseven.com/1/main/result.css" onerror="this.href='https://fontsapi-storage.zeoseven.com/1/main/result.css'" /> <style> body { font-family: "JinzisheTongfang"; font-weight: normal; } </style>
通常用于: HTML
优点: 更高的加载优先级,字体被缓存后无闪烁,加载冗余
缺点: 会阻塞 HTML 渲染
提供: 仅大体积字体
#HTML 无阻塞
此选项可以解决常规 <link> 加载 CSS 阻塞渲染的问题,但可能导致字体闪烁,同时使用 noscript 标签确保兼容性。
<link rel="preload" as="style" crossorigin href="https://fontsapi.zeoseven.com/1/main/result.css" onload="this.rel='stylesheet'" onerror="this.href='https://fontsapi-storage.zeoseven.com/1/main/result.css'" /> <noscript> <link rel="stylesheet" href="https://fontsapi.zeoseven.com/1/main/result.css" /> </noscript> <style> body { font-family: "JinzisheTongfang"; font-weight: normal; } </style>
通常用于: HTML
优点: 更低的加载优先级,无阻塞 HTML 渲染,加载冗余
缺点: 在非 SPA 等客户端路由中字体被缓存后仍然闪烁
提供: 仅大体积字体
#无阻塞.js
将会在字体的详情页提供一段 JS 代码异步的加载字体,实现当 FontsAPI L1 出现错误时立即直接由 L2 提供文件来始终不断的加载字体,适合 React / Vue3 等客户端路由场景。
通常用于: JavaScript
需要使用 <script> 包裹的: HTML
优点: 更低的加载优先级,无阻塞 HTML 渲染,加载冗余
缺点: 在非 SPA 等客户端路由中字体被缓存后仍然闪烁,客户端未开启 JavaScript 会导致无效
提供: 仅小体积字体
#英文子集化
提供一个静态的子集化的 WOFF2 文件,其中包含一小部分字符,用于只需要字体的英文字符和数字的情况下,因为此选项只需要加载 10KB 左右的文件,将庞大的 CJK 字体子集化为英文字体,字符有:
AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz1234567890 ,.!?:;-
@font-face { font-family: 'zsft-enmin-1'; src: url('https://fontsapi.zeoseven.com/1/main.woff2') format('woff2'), url('https://fontsapi-storage.zeoseven.com/1/main.woff2') format('woff2'); unicode-range: U+0061-007A, U+0041-005A, U+0030-0039, U+002E, U+002C, U+0021, U+003F, U+003A, U+003B, U+002D; } body { font-family: "zsft-enmin-1"; font-weight: normal; }
通常用于: CSS
需要使用 <style> 包裹的: HTML
优点:更高的加载优先级,字体被缓存后无闪烁, WebFonts 的标准方法,加载更快
缺点:会阻塞 HTML 渲染,字库字符缺失
提供:仅大体积字体
#常见问题 (FAQ)
#支持连字的字体如何取消连字?
在字体设计者遵循标准的情况下,可以使用 CSS 在使用字体的容器中,添加一个叫做 font-variant-ligatures 的属性,要关闭所有连字特性,可以将值设置为 none 。如下:
body { font-variant-ligatures: none; }
你可以在 Mozilla Developer 中找到其标准行为。
#一款可变(Variable)字体有斜体版本,如何使用斜体?
在字体设计者遵循标准的情况下,可以使用 CSS 在使用字体的容器中,添加或修改 font-style 属性,将其设置为 斜体 italic 或 倾斜体 oblique ,虽然大多数情况下它们都是一样的。
body { font-style: oblique; }
甚至说,在一些字体支持的情况下,还可以指定倾斜程度,如:
body { font-style: oblique 20deg; }
你可以在 Mozilla Developer 中找到其标准行为。
#关于 FontsAPI 人机验证
人机验证只会出现在 fontsapi.zeoseven.com 的异常请求。
因过去国内某 “大型” 搜索引擎爬虫 Yis**S***** 无视标准的 robots.txt 禁止规则,每天进行超过 20 万次的大量无效爬取请求,与此同时,超过 2 次的中小规模恶意攻击导致的虚高流量尖峰不仅影响了正常 FontsAPI 调用者也导致我们的支持者为此支付高额账单,所以在 2025-04-29 添加人机验证以进行流量清洗。
正常且在预料之中的请求不会受到人机验证影响,如在 HTTP 或 HTTPS 协议中的 <link>, @import 等正常嵌入字体而进行的调用请求。
#关于 FontsPKG (下载功能)
可以前往我们的 Blog 查阅下载功能发行说明。
#关于热度值
记录 过去 30 天 内字体的累计统计数据,热度值 会下降和上升,以 层级 表示。
热度值从来不是一个准确的数字,如果热度值为最低的 100 ,那将代表这款字体在过去一个月 从未被 点击、查阅或搜索(包括搜索引擎),那将是糟糕的,而在之后的层级,数字越大,代表过去一个月内被 点击、查阅或搜索 的次数越多,如 1k、2k、3k ... 9k、1w ... 没有上限 。
当然,这不过代表字体在 ZSFT 中的受欢迎程度。和 ZSFT 站点的流量密切相关。
#字体收录条件
出于对知识产权的尊重及保护和对使用 WebFonts 用户的法律风险负责,所以字体的许可协议需要满足三个条件才能收录:
免费商用 或 开放非盈利性使用
允许转换和二次分发
允许嵌入
常见的满足条件的许可协议: OFL-1.1 / MIT / Apache-2.0 / GPL-3.0 / GPL-2.0 。
需要被特殊处理的许可协议: IPA 。
明确不允许的许可协议: CC BY-NC 。
#热门的无法收录字体
MiSans / vivo Sans 其许可协议不允许二次分发,故提供 WebFonts 或下载将违反协议。 HarmonyOS Sans 其许可协议不允许单独二次分发,故提供 WebFonts 或下载将违反协议。 * 阿里妈妈系列 其许可协议不允许 转换、拆分,无法提供 WebFonts ,除非系列内具有例外。
#无法正常提供的字体
以下字体在提交收录申请后,即便是转换格式,也无法被子集或切割,或者最终输出乱码或字符错位而无法提供或无效的提供 WebFont 。
ChillMovableType / 活字印刷字体项目 github.com/Warren2060/ChillMovableType [V1.000] 不转换(.otf)切割则字符为空白或缺字,转换后(.ttf)切割出现乱码,西文错位。 ChosunNm / ChosunilboNM / 조선일보명조 / 朝鲜日报明朝体 event.chosun.com/100/100font.html [V001.300 & V001.400] 切割后加载到浏览器测试时无法解析字体元数据表导致 OTS 问题而无法加载。 genyo-font / 源樣明體 github.com/ButTaiwan/genyo-font [V2.100] 无法被转换到 .ttf ,直接(.otf)子集会导致西文乱码或呈现 ? 号。
#违法违规内容的定义和处理措施
ZSFT 和第三方 CDN 提供商是位于中国的已备案 CDN 服务,严格遵守 《网络安全法》 等法律法规,拒绝为含违法违规内容的主体提供服务。即便它禁止中国大陆的访客访问。
本机制遵循 “技术中立” 原则,对符合中国法律法规的境外网站保持服务中立。网络运营商公网 IP 原则上不纳入拦截范围,正常用户使用不受影响。
覆盖主体
IPv4, IPv6, CIDR/IP, Domain
该机制只影响 fontsapi.zeoseven.com 。
#处理措施
ZSFT 将使用包括但不限于让 FontsAPI 返回 403 响应码的措施来导致相关字体资源无法加载。
法律声明
本机制依据《网络安全法》第十六条及《互联网信息服务管理办法》第十五条设立,系保障 ZSFT FontsAPI 服务合规运营的必要措施。
#误封申诉
有时, ZSFT 可能会误判导致域名或 IP 被列为违法违规内容,则您可以 联系我们 并表明被误判的域名或 IP 及合法性证据和误判原因。
#FontsAPI 响应标头
fontsapi.zeoseven.com 和 fontsapi-storage.zeoseven.com 的响应标头中,都具有以下响应:
#Cache-Control
public, max-age=86400, must-revalidate / public, max-age=31536000, immutable
对于 WOFF2 文件,除了英文子集化 WOFF2 ,可以完全无限期的缓存,尤其是最新解决方案的大体积字体 WOFF2 文件以哈希值命名。
只有对于 CSS 文件或英文子集化 WOFF2 ,才会使用一个较短的缓存,以在字体设计师更新时及时跟进。
#Access-Control-Allow-Origin
*
这指定了任何主机名都可以对其中的资源进行跨域请求,这是常见的跨域响应标头且必须。
#Access-Control-Allow-Methods
GET, HEAD, OPTIONS
这指定了跨域请求允许的请求方法,通常来说,静态资源只需要 GET, OPTIONS 和 HEAD 方法即可满足使用需求。
#Access-Control-Max-Age
31536000
跨域请求会首先发出预检请求来确认目标服务器是否允许跨域,而此标头指定了跨域请求在发出预检请求后,允许跨域或不允许跨域应该保留 1 年,即最大时间 1 年内都不需要再次发出预检请求确认是否允许跨域。
#Access-Control-Allow-Credentials
false
这指定了不允许跨域请求携带凭据,当然携带凭据也没有什么作用,因为 ZSFT FontsAPI 完全静态。