字体族预览

同一段文字在不同 font-family 下的真实效果,顺便告诉你这台机器上装了哪些字体,并生成可直接贴走的 CSS。

改成你站点里真实的标题或正文更好判断效果。标「本机可用」的字体是刚才在这台机器上探测出来的,换个设备结论可能不同。

字体回退到底怎么走的

font-family 写的是一个候选列表,不是「用这个字体」。浏览器从左到右找第一个本机存在的字体,找到就用它渲染整段文字;列表里一个都没有命中时,才落到最后的通用族,由系统给一个默认字体。所以写字体栈时最后一定要留 sans-serif、serif 或 monospace,否则缺字体时行高和字宽可能完全变样。

更麻烦的是单个字符级别的回退:中文主字体里没有某个生僻字、或者没有 emoji 和符号时,浏览器会单独为那个字符换字体,结果同一行文字出现两种字形、字重也不一致。中文站点里把「中文优先、英文退到系统西文字体」写清楚(例如 PingFang SC 之后跟 Helvetica Neue),比反过来更常见也更稳。

各平台的默认中文字体并不相同:Windows 是微软雅黑(旧系统是宋体),macOS 和 iOS 是苹方,Linux 上常见文泉驿和思源黑体,Android 近几代是 Noto Sans CJK 加 HarmonyOS Sans 一类的定制字体。所以同一个 font-family 在不同系统上的观感会有差异,做高一致性要求的页面要么自带 Web 字体,要么就接受这种平台差异。

自建字体时要把 font-display 想清楚:swap 先用兜底字体渲染、字体下载完再替换,页面不会白字,但会发生字形跳动;optional 更保守,网络慢时干脆不用 Web 字体。中文字体动辄几 MB,整包加载很浪费,所以常见做法是只把标题或首屏需要的少量字子集化,正文继续用系统字体。

这里的「本机可用」用 canvas 宽度对比法探测:同一串字符分别用「候选字体 + 兜底字体」和「只有兜底字体」量一次,宽度不同就说明候选字体真的生效了。它只能告诉你字体在不在,不能告诉你字体有几个字重、有没有斜体,也没法在字体没装时把效果画出来——那属于 Web 字体加载,要另外做。