← 返回信息流
AI 资讯Hacker News·3 天前

Font-Family Recommendations

速览

未提供正文内容,无法生成摘要。

AI 深度解读

Font-Family Recommendations:为什么你应该停止在 CSS 中罗列字体

背景

在 Web 开发中,font-family(字体族)属性的配置长期以来被视为一种“最佳实践”的集合,开发者往往通过罗列大量特定字体名称来确保文本在不同操作系统和设备上呈现一致。然而,随着 Web 标准的演进、用户隐私意识的提升以及浏览器默认行为的优化,这种传统的字体堆叠策略正变得过时甚至有害。

本文基于 Hacker News 上的一篇深度讨论,旨在重新审视 font-family 的配置逻辑。文章指出,没有任何字体是真正“Web 安全”的,过度依赖本地安装的特定字体或 Web 字体不仅增加了加载复杂性,还可能破坏页面的可访问性和性能。作者主张回归极简主义,主要依赖通用字体族(Generic Families),并批判了当前广泛存在的字体配置误区。

核心内容

1. 永远不要假设某个命名字体能够正常工作

文章开篇即打破了一个常见的迷思:不存在跨所有主要平台通用的“Web 安全字体”。无论是传统的本地字体还是通过 @font-face 引入的 Web 字体,都存在不可靠性。

  • 网络与加载风险:如果 Web 字体未内联,子资源可能因各种网络原因加载失败。
  • 安全与隐私限制:字体加载涉及安全问题,许多用户会使用 uBlock Origin 等工具专门禁用远程字体加载。此外,部分浏览器的“数据节省模式”也会阻止字体加载。
  • 用户自主权:自 2020 年以来,越来越多的用户选择在浏览器设置中禁止网站自定义字体,以提升浏览体验。
  • JavaScript 的局限性:即使使用 document.fonts.load("1em my-web-font") 进行预加载,该 Promise 也可能被拒绝,导致依赖字体加载的逻辑在 2020–2025 年间多次出现断裂。

因此,作者认为,通用字体族(如 sans-serif, monospace)是唯一真正可靠的选择

2. 具体配置建议

基于上述前提,文章提出了具体的 CSS 编写规范:

  • a) 若需要等宽字体,必须包含 monospace 许多页面错误地强制使用等宽字体,或者在字体栈中遗漏了 monospace。如果字体栈中缺少 monospace,浏览器可能会回退到默认的衬线字体(Serif),导致代码块或表格等需要对齐的内容显示混乱。

    • 正确示例pre { font-family: "jgs", monospace; }
  • b) 若需要衬线或无衬线字体,应包含对应的通用族 虽然 serifsans-serif 通常不是关键,但为了稳健性,仍应包含它们作为后备。

    • 示例font-family: Arial, sans-serif;

3. 停止罗列系统可能安装的字体

作者强烈批评了那种冗长的字体堆叠写法,例如: font-family: "Arial", Helvetica, 'Helvetica Neue', Liberation Sans, "Noto Sans", sans-serif;

  • 移除特定字体ArialRoboto 等特定字体不应被显式列出。因为 sans-serif 通用族解析出的字体绝不会比 Arial 差,甚至可能更好。罗列它们只会增加 CSS 体积,而无实际收益。
  • 极端案例批判:作者发现了一个极端的例子:font-family: Menlo, Monaco, ..., Courier New, monospace, serif。这种写法不仅冗余,而且逻辑混乱(同时指定了 monospace 和 serif)。作者认为,monospace 通用族解析出的字体质量足以胜任,无需罗列 Menlo、Monaco 等旧式字体。
  • 例外情况:仅当特定字体具有独特的风格特征且对设计至关重要时(如 GeorgiaTimes New Roman 更宽),才考虑保留一个命名字体。但即便如此,也应限制在最多一个命名非 Web 字体。

4. 强烈建议仅使用通用字体族

既然本地字体不可靠,Web 字体又存在加载延迟和布局重排(Reflow)问题,作者建议直接使用用户系统默认的字体。

  • 浏览器默认字体已足够好:历史上,Courier New 等字体因数字化质量差(字重约为 200-250 而非标准的 400)而被开发者规避。但随着时间推移,现代浏览器的默认等宽字体已得到显著改善。
  • 简化代码:作者建议直接使用 font-family: monospace;font-family: monospace, monospace;(后者是为了确保某些旧版浏览器或特定场景下的行为一致性,尽管前者通常已足够)。
  • 字体大小问题:需要注意的是,如果显式或隐式地设置 monospace,字体大小可能会默认为 81.25% 而非 100%。开发者需注意这一点,或手动设置 font-size

5. 不要对正文内容使用 system-uiui-*

system-ui-apple-system 等 CSS 字体族旨在用于短小的 UI 文本,而非长篇内容。

  • 语言支持问题system-ui 在不同平台上的表现差异巨大。macOS 对此支持较好,但 Windows 支持较差,可能导致中文、日文等 CJK 用户看到糟糕的等宽字体。
  • 滥用现状:W3C CSSWG Issue #3658 和 MDN Issue #41244 均指出,system-ui 被广泛滥用。它常被用作获取“更好默认字体”的代理,但这并非其设计初衷。
  • 历史遗留:作者认为 system-ui 是一个错误的设计。当初应保留 -apple-system,并让 Blink 引擎的 BlinkMacSystemFont 指向它,因为当时其他平台没有等效概念。如今,使用 system-ui 可能导致内容显示怪异,应谨慎使用。

关键要点

  • 无绝对安全的字体:没有字体能在所有平台、所有网络环境和所有用户设置下可靠加载。
  • 通用族是基石sans-serifserifmonospace 是唯一能保证基本可读性和布局稳定性的字体族。
  • 拒绝冗长堆叠:不要罗列 ArialRobotoMenlo 等特定字体,sans-serifmonospace 的回退效果通常优于或等同于这些特定字体。
  • Web 字体需谨慎:Web 字体加载失败率高,且涉及隐私和安全限制。除非必要,否则应优先使用系统默认字体。
  • system-ui 的陷阱:避免在正文内容中使用 system-ui,因其语言支持不一致,可能导致非拉丁语系用户看到错误的字体。
  • 等宽字体配置:对于代码块等需要等宽的场景,确保字体栈中包含 monospace,并考虑直接使用 font-family: monospace; 以简化维护。
  • 用户控制权:尊重用户禁用远程字体或自定义默认字体的选择,这是提升 Web 体验的重要趋势。

意义与影响

这篇文章反映了 Web 开发理念从“控制一切”向“尊重环境与用户”的转变。

  1. 性能与可访问性提升:通过减少不必要的字体加载请求和复杂的字体回退逻辑,可以显著提升页面加载速度,减少布局抖动(CLS),并更好地适应不同用户的网络状况和设备能力。
  2. 简化 CSS 维护:摒弃冗长的字体堆叠使得 CSS 代码更加简洁、易于维护,降低了开发者因字体缺失而导致的样式断裂风险。
  3. 推动标准演进:对 system-ui 滥用的批评以及对浏览器默认字体改进的认可,有助于推动浏览器厂商进一步优化默认字体渲染,并促使 CSS 工作组重新审视相关规范。
  4. 用户中心设计:承认用户有权禁用远程字体和自定义默认字体,体现了 Web 开放性和用户自主权的核心价值。开发者应构建更具韧性的设计,而非依赖特定的
查看原文 →chrismorgan.info