图像与设计
网页字体选型与实现:解决字体搭配、可读性、层次…
当需要为 Web 项目选择、搭配、实现字体,并优化正文可读性、层次、响应式字号和字体加载性能时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 49/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 85/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
网页字体选型与实现:解决字体搭配、可读性通用
解决思路
- 用「清晰酒杯」原则:选择字体时优先让内容清晰,字体本身不抢注意力;字体语气必须匹配内容(法律站点不俏皮,儿童应用不企业)。
- 用 10 项 Quick Diagnostic 对实现打分,满分 10;先说明当前得分和未通过项,再按失败项修复。
- 按场景拆分排版:标题、按钮、导航、logo 属于「瞬间排版」,优先个性、冲击力、辨识度;正文、文章、文档属于「长期共处排版」,优先可读性、舒适度、耐久性。
- 正文/长文使用 workhorse 字体,如 Georgia、Source Sans、Freight Text、FF Meta,使字体跨字号、字重、场景稳定且不喧宾夺主。
- 按阅读机制设置:眼睛以 7-9 字符的 saccades 跳动,行宽和字距直接影响效率;注视点会被过密或差间距拖慢;成熟读者靠单词轮廓(bouma)识别,不要只优化单字。
- 区分 legibility 与 readability:legibility 是字符能否区分(字体本身);readability 是长篇是否舒适(字号、间距、行宽)。可读的字体也可能被排得不可读。
- 长文内容按持续舒适优化:正文 16-18px、行高 1.5-1.7、每行 45-75 字符。
- Dashboard UI 按快速扫读优化:使用明显字重层次,并在数据组之间留白。
- 移动端阅读按距离和光照优化:正文加大到 17-18px,并提高对比度。
- 应用长文 CSS:.prose { font-size: 1.125rem; line-height: 1.6; max-width: 65ch; }。
- 需要命名 letterform 部件(x-height、counter、aperture)或按分类体系解释字体选择时,查阅 references/typeface-anatomy.md。
- 字体先过技术质量检查:笔画粗细一致、文本块视觉颜色均匀、kerning 对(AV、To、Ty)良好、字符集完整、至少有 regular/bold/italic 多个字重。
- 做结构评估:优先 x-height 较大、counter/aperture 开放(a、e、c)、字形可区分(Il1、O0、rn vs. m)的字体。
- 做实用检查:在实际使用字号和目标屏幕上测试,检查文件大小,核实许可证。
- 用真实内容测试,不用 Lorem ipsum;它会掩盖字符频率、词长和段落节奏问题。
- 正文选型优先 x-height、开放 counter、均匀视觉颜色,例如长文用 Source Serif Pro 而非 Didot。
- UI/系统文字优先小字号可读性和字重范围,例如 Inter 或 SF Pro。
- 多语言产品先验证目标语言 glyph 覆盖,例如 Noto Sans 的广泛 Unicode 支持。
- 在每种实际字号做压力测试:body { font-size: 16px; }、.caption { font-size: 0.75rem; }、h1 { font-size: 3rem; }。
- 上线前始终核实 Web 字体许可证;桌面/印刷许可证通常不覆盖 Web 嵌入,未授权使用有法律风险。
- 选字体从用途出发,不从审美出发;按内容语气、阅读场景、阅读时长驱动选择。
- 先定义任务:正文、标题、UI 元素可能各需不同字体。
- 将语气匹配内容:财务报告与面包店菜单需要不同声音。
- 提交前检查字体家族是否包含所需字重、斜体和样式。
- 安全起点:正文字体 serif 可选 Georgia、Source Serif Pro、Charter;正文 sans 可选 system fonts、Source Sans Pro、Inter、IBM Plex Sans。
- 内容型网站用 workhorse serif 或 sans 支持持续阅读,例如 Source Serif Pro 或 Charter。
- SaaS dashboard 用干净 sans 并提供强 tabular figures,例如 Inter 或 IBM Plex Sans。
- 无障碍优先场景用为最大可读性设计的字体,例如 Atkinson Hyperlegible。
- Web 字体始终带 system fallback stack,例如 body { font-family: 'Source Sans Pro', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; }。
- 搭配字体时最多 1-2 种,并制造明显对比,不要选令人困惑地相似的字体。
- 用结构(serif + sans)、字重(light + regular)、时代(humanist + geometric)、宽度(condensed + normal)制造对比。
- 可用同设计师策略(如 FF Meta + FF Meta Serif)或 superfamilies(如 Roboto + Roboto Slab)减少搭配失误。
- 避免搭配失败:两种几乎相同的字体、两种字体争抢注意力、一种压倒另一种。
- 编辑型站点可用 serif 标题 + sans 正文,例如 Playfair Display + Source Sans Pro。
- 文档可用同一家族的 monospace 代码 + sans 正文,例如 IBM Plex Mono + IBM Plex Sans。
- 极简品牌可用单一字体家族通过字重和字号变化,例如 Inter。
- 用经典 serif + sans 搭配 CSS:h1,h2,h3 { font-family: 'Playfair Display', Georgia, serif; } body { font-family: 'Source Sans Pro', -apple-system, sans-serif; }。
- 把字号、行宽、行高作为舒适阅读三基础;它们比字体选择更重要。
- 正文字号至少 16px;阅读密集站点用 18px;移动用户拿手机比设计师假设更远,需更大。
- 行宽控制在 45-75 字符,66 最佳;用 ch 单位或 max-width 强制。
- 正文行高 1.4-1.8;行越长行高越大;标题行高更紧,1.1-1.25。
- 标题层级使用一致比例 1.2-1.5,形成层次且不极端。
- 博客/文章用 max-width: 65ch、line-height: 1.6。
- Dashboard 用更紧行高处理密集数据,例如表格单元和标签用 line-height: 1.3。
- Landing page 用宽松尺寸提升扫读性,例如 font-size: 1.25rem; line-height: 1.7。
- 应用响应式字号 CSS:.prose { font-size: clamp(1rem, 0.95rem + 0.25vw, 1.125rem); line-height: 1.6; max-width: 65ch; }。
- 按上下文设置行高:h1,h2 { line-height: 1.1; }、.ui-text { line-height: 1.35; }、.body-text { line-height: 1.6; }。
- 写 clamp() 公式时查阅 references/responsive-typography.md,推导 min/preferred/max 和基于视口的测量策略。
- 用层级告诉读者重点;通过 size、weight、color 受控变化创建区分,但不要同时拉满三个杠杆。
- 相邻层级只变化一到两个杠杆(size/weight/color),绝不同时变三个。
- 做 squint test:眯眼看页面仍应能看出层级。
- 使用模块化比例 1.2-1.5 生成标题层级,避免任意字号造成噪声。
- 不要跳级,例如 H1 直接到 H3 会破坏读者心智模型。
- 内容页可用 4-5 级 size+weight 层次,例如 H1 2.5rem/700、H2 1.75rem/600、Body 1rem/400。
- Dashboard 用 weight+color 区分数据与标签,例如值用 bold #111、标签用 regular #666。
- 表单 UI 用细微字重变化区分标签,例如 Label 600、input 400。
- 应用层级 CSS:h1 { font-size: clamp(2rem, 1.5rem + 2vw, 3rem); font-weight: 700; color: #111; } h2 { font-size: clamp(1.5rem, 1.25rem + 1vw, 2rem); font-weight: 600; color: #111; } body { font-size: 1rem; font-weight: 400; color: #333; } .secondary { font-size: 0.875rem; color: #666; }。
- 标题间距上大于下:h1,h2,h3 { margin: 1.5em 0 0.5em; line-height: 1.2; }。
- 不要用小型或低对比字体埋藏费用、免责声明、退出选项等用户需要看到的信息;不要用层级武器化排版。
- 实现完整层级、@font-face 加载、font-variation-settings 轴、pyftsubset 子集化时查阅 references/css-implementation.md。
- 用 fluid typography 让文字适配屏幕:clamp(min, preferred, max) 可在视口间平滑缩放,排版无需 media queries。
- 断点调整:移动端正文稍大(17-18px),标题比例更紧;桌面端可放大展示字号,同时保持行宽限制。
- 字体加载策略:font-display: swap 立即显示 fallback 文本;preload 关键字体;按需子集化。
- 性能预算:字体总负载控制在 200KB 以下;优先 WOFF2;variable font 可替代 4-6 个静态字重文件。
- 内容站用 clamp() 流体字号,例如 font-size: clamp(1rem, 0.9rem + 0.5vw, 1.25rem)。
- 电商可 preload hero 字体,懒加载次要字重,例如 <link rel='preload' href='font.woff2' as='font'>。
- 全球产品按语言子集化以降低负载:英文 Latin subset,亚洲页面 CJK subset。
- 应用 @font-face:font-family: 'Custom Font'; src: url('/fonts/custom.woff2') format('woff2'); font-display: swap; unicode-range: U+0000-00FF;。
- 在 <head> preload 字体:<link rel='preload' href='/fonts/custom.woff2' as='font' type='font/woff2' crossorigin>。
- 不要为了优化牺牲包容性:不要子集掉非英语读者需要的字符,也不要移除强调所需的 italic/bold 字重。
- 修复常见问题-文字局促:将 line-height 增到 1.6+,增加段间距。
- 修复常见问题-行太长:文本容器 max-width: 65ch。
- 修复常见问题-标题脱节:减少标题上方间距,保留下方间距。
- 修复常见问题-文字模糊:检查 font-smoothing;尝试不同字重;增大字号。
- 修复常见问题-字体加载慢:子集化;font-display: swap;preload 关键字体。
- 修复常见问题-正文太小:增到 18px;在真实距离测试。
- 修复常见问题-层级不清:增大字号/字重差异。
- 修复常见问题-字体冲突:改用单一家族,或确保结构对比(serif + sans)。
- 修复常见问题-Lorem ipsum 测试:改用真实、有代表性的内容。
- Quick Diagnostic 自检-正文字号:如果小于 16px,至少调到 16px;阅读密集页优先 18px。
- Quick Diagnostic 自检-行宽:如果达到或超过 75 字符,在 prose 容器设置 max-width: 65ch。
- Quick Diagnostic 自检-正文行高:如果小于 1.4,调到 1.5-1.7。
- Quick Diagnostic 自检-层级对比:如果不清晰,增大字号或字重差异。
- Quick Diagnostic 自检-实际字号/真实屏幕:如果没有,在每个使用字号和目标设备上测试。
- Quick Diagnostic 自检-字体总负载:如果超过 200KB,子集化、用 WOFF2、考虑 variable fonts。
- Quick Diagnostic 自检-fallback 字体:如果未指定,在每个 font-family 中加入系统 fallback。
- Quick Diagnostic 自检-200% zoom:如果页面失效,修复溢出和截断。
- Quick Diagnostic 自检-标题孤词:如果有,用 text-wrap: balance 或手动换行。
- Quick Diagnostic 自检-链接可识别:如果不明显,用颜色和/或下划线区分。
适用边界 · 注意事项
- 需要整体 UI 设计系统时,本案不覆盖,改用 refactoring-ui。
- 需要戏剧化排版体验时,本案不覆盖,改用 top-design。
- 非 Web 场景(纯印刷或桌面软件排版)不适用。