CSS font-family 属性详解
font-family 是 CSS 中用于指定元素文本字体的属性,它是网页排版和品牌视觉一致性的核心。
基本语法
font-family: [字体族名称 | 通用字体族], [字体族名称 | 通用字体族], ...;
字体指定机制
1. 字体栈(Font Stack)
浏览器按顺序尝试字体列表,直到找到可用的字体:
body {
font-family: 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;
}
/* 优先使用Segoe UI,不可用则尝试Roboto,以此类推 */2. 字体名称规则
带空格的字体名:必须用引号包裹
font-family: 'Times New Roman', serif; /* 正确 */ font-family: Times New Roman, serif; /* 错误 */
不带空格的字体名:引号可选
font-family: Arial, sans-serif; /* 正确 */ font-family: 'Arial', sans-serif; /* 正确 */
字体分类详解
1. 通用字体族(Generic Families)
| 通用族 | 说明 | 典型代表字体 | 适用场景 |
|---|---|---|---|
serif | 衬线体 | Times New Roman, Georgia, 宋体 | 印刷品、传统排版、长篇文章 |
sans-serif | 无衬线体 | Arial, Helvetica, Verdana, 微软雅黑 | 网页UI、屏幕显示、现代设计 |
monospace | 等宽字体 | Courier New, Consolas, Monaco | 代码、终端、表格数据 |
cursive | 手写体 | Comic Sans MS, 草书字体 | 装饰性标题、个性化设计 |
fantasy | 艺术字体 | Impact, Papyrus | 艺术设计、特殊效果 |
system-ui | 系统UI字体 | 使用操作系统默认界面字体 | 保持与操作系统一致 |
math | 数学字体 | 专门用于数学符号和公式 | 数学公式排版 |
emoji | 表情符号字体 | Segoe UI Emoji, Apple Color Emoji | 表情符号显示 |
fangsong | 仿宋体(中文) | 仿宋 | 中文传统印刷 |
2. 中文字体栈示例
/* Windows优先 */
.chinese-win {
font-family: 'Microsoft YaHei', '微软雅黑', SimHei, sans-serif;
}
/* macOS优先 */
.chinese-mac {
font-family: 'PingFang SC', 'Hiragino Sans GB', 'Heiti SC', sans-serif;
}
/* 跨平台方案 */
.chinese-cross {
font-family:
'Microsoft YaHei', '微软雅黑', /* Windows */
'PingFang SC', 'Hiragino Sans GB', /* macOS */
'Source Han Sans CN', /* 思源黑体 */
'Noto Sans CJK SC', /* Google字体 */
sans-serif;
}Web字体使用
1. @font-face 规则
@font-face {
font-family: 'CustomFont'; /* 定义字体名称 */
src: url('font.woff2') format('woff2'), /* 现代格式优先 */
url('font.woff') format('woff'); /* 回退格式 */
font-weight: 400; /* 字重 */
font-style: normal; /* 样式 */
font-display: swap; /* 显示策略 */
}
body {
font-family: 'CustomFont', sans-serif;
}2. 字体格式支持
| 格式 | 扩展名 | 压缩率 | 浏览器支持 | 特点 |
|---|---|---|---|---|
| WOFF2 | .woff2 | 最高 | Chrome 36+, Firefox 39+ | 现代标准,最佳压缩 |
| WOFF | .woff | 高 | IE9+, 所有现代浏览器 | 广泛支持 |
| TTF/OTF | .ttf, .otf | 中 | 广泛支持 | 原始字体文件 |
| EOT | .eot | 低 | IE8-IE11 | IE专用格式 |
| SVG | .svg | 最高 | 旧版iOS Safari | 矢量格式,现已不推荐 |
3. 字体加载优化
@font-face {
font-family: 'OptimizedFont';
src: url('font-light.woff2') format('woff2');
font-weight: 300;
font-display: swap; /* 先显示后备字体,再交换 */
unicode-range: U+0020-007F; /* 仅加载ASCII字符集 */
}
@font-face {
font-family: 'OptimizedFont';
src: url('font-regular.woff2') format('woff2');
font-weight: 400;
font-display: swap;
}实用字体栈配置
1. 跨操作系统英文字体栈
/* 现代无衬线字体栈 */
.modern-sans {
font-family:
-apple-system, /* macOS San Francisco */
BlinkMacSystemFont, /* macOS Chrome备用 */
'Segoe UI', /* Windows */
Roboto, /* Android/Chrome OS */
'Helvetica Neue', /* 旧版macOS */
Arial, /* 广泛支持 */
sans-serif;
}
/* 衬线字体栈 */
.serif-stack {
font-family:
Georgia, /* Windows/macOS */
'Times New Roman', /* 广泛支持 */
Times, /* Unix */
serif;
}
/* 等宽字体栈(代码显示) */
.code-stack {
font-family:
'SF Mono', /* macOS */
'Cascadia Code', /* Windows Terminal */
'Fira Code', /* 编程连字 */
Consolas, /* Windows */
'Courier New', /* 广泛支持 */
monospace;
}2. 响应式字体选择
:root {
--font-system: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-mono: 'SF Mono', Consolas, monospace;
}
body {
font-family: var(--font-system);
}
pre, code {
font-family: var(--font-mono);
}
@media (prefers-color-scheme: dark) {
/* 深色模式可能使用不同字体 */
body {
font-family:
'SF Pro Display', /* macOS深色模式优化 */
var(--font-system);
}
}字体属性组合
1. 与 font-weight 配合
@font-face {
font-family: 'VariableFont';
src: url('font.woff2') format('woff2-variations');
font-weight: 100 900; /* 可变字体范围 */
}
.element {
font-family: 'VariableFont', sans-serif;
font-weight: 450; /* 使用中间值 */
}2. 与 font-feature-settings 配合
.advanced-typography {
font-family: 'Open Sans', sans-serif;
font-feature-settings:
"kern" 1, /* 字距调整 */
"liga" 1, /* 标准连字 */
"clig" 1; /* 上下文连字 */
}性能优化策略
1. 字体子集化
/* 中文子集示例 - 仅加载常用字符 */
@font-face {
font-family: 'SubsetFont';
src: url('font-subset.woff2') format('woff2');
unicode-range: U+4E00-4EFF, U+3000-30FF; /* 常用汉字和标点 */
}2. 字体加载策略对比
/* 策略1:阻塞渲染(默认) */
.blocking {
font-display: block; /* FOIT - 字体不可见闪烁 */
}
/* 策略2:交换(推荐) */
.swapping {
font-display: swap; /* FOUT - 无样式文本闪烁 */
}
/* 策略3:自动(平衡) */
.auto {
font-display: auto; /* 浏览器决定 */
}
/* 策略4:回退 */
.fallback {
font-display: fallback; /* 短暂阻塞后回退 */
}
/* 策略5:可选 */
.optional {
font-display: optional; /* 几乎不阻塞,可能不显示 */
}浏览器兼容性处理
1. 特征检测字体可用性
// JavaScript检测字体是否加载
function checkFont(fontName) {
return document.fonts.check(`12px "${fontName}"`);
}
// CSS配合使用
.element {
font-family: fallback-sans;
}
.font-loaded .element {
font-family: 'WebFont', fallback-sans;
}2. 渐进增强字体加载
/* 基础 - 系统字体 */
body {
font-family: system-ui, sans-serif;
}
/* 增强 - 如果字体加载成功 */
@supports (font-variation-settings: 'wght' 400) {
.enhanced {
font-family: 'VariableFont', system-ui, sans-serif;
}
}font-family 属性总结表
| 特性 | 说明 |
|---|---|
| 继承性 | 是 |
| 初始值 | 取决于浏览器/操作系统 |
| 适用元素 | 所有元素 |
| 动画性 | 否 |
| 计算值 | 按指定值 |
| 百分比值 | 不支持 |
| 媒体查询 | 支持 |
字体匹配算法步骤
用户代理维护字体数据库
按
font-family列表顺序匹配检查字体可用性(已安装/已加载)
匹配字体样式(weight, style, stretch)
如果未找到,使用默认字体
最佳实践指南
1. 设计原则
/* 建立设计系统字体变量 */
:root {
--font-primary: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
--font-secondary: Georgia, 'Times New Roman', serif;
--font-code: 'SF Mono', Consolas, monospace;
--font-cn: 'PingFang SC', 'Microsoft YaHei', sans-serif;
}
/* 应用层使用 */
body { font-family: var(--font-primary); }
.heading { font-family: var(--font-secondary); }
code { font-family: var(--font-code); }
.chinese { font-family: var(--font-cn); }2. 性能清单
✅ 使用 WOFF2 格式
✅ 实施字体子集化
✅ 设置
font-display: swap✅ 使用
unicode-range分割字体✅ 预加载关键字体
❌ 避免过多字体文件
❌ 避免使用大字体文件
3. 可访问性考虑
/* 支持操作系统偏好 */
@media (prefers-reduced-motion: no-preference) {
.smooth-font {
font-smooth: always;
-webkit-font-smoothing: antialiased;
}
}
/* 高对比度模式支持 */
@media (prefers-contrast: high) {
body {
font-family:
'Arial Black', /* 更粗的字体 */
sans-serif;
font-weight: 900;
}
}
/* 减少透明度时的字体调整 */
@media (prefers-reduced-transparency: reduce) {
.text {
font-family: sans-serif; /* 使用更清晰的字体 */
text-shadow: none;
}
}4. 国际化支持
/* 多语言字体栈 */
.multilingual {
font-family:
/* 拉丁字母 */
-apple-system, BlinkMacSystemFont,
/* 西里尔字母 */
'Roboto',
/* 阿拉伯语 */
'SF Arabic',
/* 日语 */
'Hiragino Kaku Gothic ProN',
/* 简体中文 */
'PingFang SC', 'Microsoft YaHei',
/* 通用回退 */
sans-serif;
}常见陷阱与解决方案
问题1:字体闪烁(FOUT/FOIT)
解决方案:
@font-face {
font-display: swap; /* 避免FOIT */
}
/* 或使用字体加载API */
<script>
document.fonts.ready.then(() => {
document.documentElement.classList.add('fonts-loaded');
});
</script>问题2:字体文件过大
解决方案:
# 使用工具优化 woff2_compress font.ttf # 转换格式 pyftsubset font.ttf --text-file=常用字.txt # 子集化
问题3:中英文混合排版
/* 错误:英文使用中文字体 */
.bad-example {
font-family: 'Microsoft YaHei', sans-serif; /* 英文显示效果差 */
}
/* 正确:分别指定 */
.good-example {
font-family:
-apple-system, BlinkMacSystemFont, /* 英文字体 */
'Microsoft YaHei', /* 中文字体 */
sans-serif;
}
/* 更好:使用unicode-range */
@font-face {
font-family: 'HybridFont';
src: local('Arial');
unicode-range: U+0020-007F; /* 基本拉丁字母 */
}
@font-face {
font-family: 'HybridFont';
src: local('Microsoft YaHei');
unicode-range: U+4E00-9FFF; /* 汉字 */
}font-family 是建立品牌视觉识别和确保跨平台一致性的关键属性。合理设计字体栈、优化字体加载、考虑国际化和可访问性,可以显著提升用户体验和网站性能。