# 文字排印——字里行间的美学

## 概述

网页上 90% 的内容是文字。文字排印（typography）直接决定了页面的阅读体验。

好的排印应该让读者**感受不到排印的存在**——它自然引导视线流动，信息层次清晰，读起来不费力。

Tailwind 提供了从字体、字号到行高、装饰的完整工具链。

## 字体

### 三种默认字体

Tailwind 预设了三类字体栈：

```html
<p class="font-sans">无衬线字体，干净现代，适合正文和标题</p>
<p class="font-serif">衬线字体，古典优雅，适合引文和长篇阅读</p>
<p class="font-mono">等宽字体，适合代码和技术内容</p>
```

| 类名 | 风格 | 适用场景 |
|------|------|----------|
| `font-sans` | 无衬线 | 正文、标题、按钮（默认） |
| `font-serif` | 衬线 | 引用块、文章正文 |
| `font-mono` | 等宽 | 代码、技术数据 |

### 自定义字体（v4）

通过 `@theme` 引入自定义字体：

```css
@import "tailwindcss";
@theme {
  --font-display: "Noto Sans SC", sans-serif;
  --font-body: "Noto Serif SC", serif;
}
```

定义后就能用 `font-display` 和 `font-body` 了。

## 字号

### 字号体系

Tailwind 从 `text-xs` 到 `text-9xl` 共 18 级字号：

```html
<h1 class="text-4xl font-bold">主标题（2.25rem / 36px）</h1>
<h2 class="text-2xl font-semibold">二级标题（1.5rem / 24px）</h2>
<h3 class="text-xl font-medium">三级标题（1.25rem / 20px）</h3>
<p class="text-base">正文（1rem / 16px，默认值）</p>
<p class="text-sm">辅助文字（0.875rem / 14px）</p>
<p class="text-xs">标注文字（0.75rem / 12px）</p>
```

常用字号速查：

![](images/03-font-size.svg)

| 类名 | rem | px | 用途 |
|------|-----|----|------|
| `text-xs` | 0.75rem | 12px | 标签、标注 |
| `text-sm` | 0.875rem | 14px | 辅助信息 |
| `text-base` | 1rem | 16px | 正文（默认） |
| `text-lg` | 1.125rem | 18px | 大号正文 |
| `text-xl` | 1.25rem | 20px | 小标题 |
| `text-2xl` | 1.5rem | 24px | 二级标题 |
| `text-3xl` | 1.875rem | 30px | 一级标题 |
| `text-4xl` | 2.25rem | 36px | 页面大标题 |
| `text-5xl` | 3rem | 48px | Hero 标题 |

> [!tip] 技巧
> 一个页面用 3~4 种字号就够了。比如：标题 `text-3xl`、小节标题 `text-xl`、正文 `text-base`、辅助 `text-sm`。层级太多反而让人眼花。

## 字重

字重控制文字的粗细，从 `font-thin`（100）到 `font-black`（900）：

```html
<p class="font-light">细体 — 300</p>
<p class="font-normal">常规 — 400，默认</p>
<p class="font-medium">中等 — 500</p>
<p class="font-semibold">半粗 — 600</p>
<p class="font-bold">粗体 — 700</p>
<p class="font-extrabold">特粗 — 800</p>
```

> [!tip] 技巧
> 标题用 `font-bold` 或 `font-semibold`，正文用 `font-normal` 即可。太多不同的字重反而破坏一致性。

## 对齐

```html
<p class="text-left">左对齐</p>
<p class="text-center">居中</p>
<p class="text-right">右对齐</p>
<p class="text-justify">两端对齐，适合大段文字</p>
```

## 行高

行高控制文本行之间的距离，影响阅读节奏：

```html
<p class="leading-tight">紧凑排版，适合标题（line-height: 1.25）</p>
<p class="leading-normal">正常行高，默认值（line-height: 1.5）</p>
<p class="leading-relaxed">宽松行高，适合正文阅读（line-height: 1.625）</p>
<p class="leading-loose">非常宽松（line-height: 2）</p>
```

正文建议用 `leading-relaxed` 或 `leading-normal`，行距太密读者容易串行。

![](images/03-line-height.svg)

## 文字装饰

### 下划线和删除线

```html
<p class="underline">下划线</p>
<p class="line-through">删除线</p>
<p class="no-underline">无下划线，常用于去除链接默认下划线</p>
```

### 装饰线颜色和宽度

```html
<a href="#" class="underline decoration-blue-500 decoration-2">
  蓝色粗下划线链接
</a>
<a href="#" class="underline decoration-gray-300 decoration-wavy">
  波浪下划线
</a>
```

### 文字省略

超过容器宽度的文字用省略号截断：

```html
<p class="truncate">
  这是一段很长的文字，超过容器宽度后会被截断并显示省略号...
</p>
```

多行省略可以用 `line-clamp`：

```html
<p class="line-clamp-2">
  这段文字最多显示两行。超过两行的部分会被截断，并用省略号表示。
  第三行及以后的内容都看不见了。
</p>
```

`line-clamp-1` 到 `line-clamp-6`，分别表示限制 1 到 6 行。常用于文章列表的摘要显示。

## 列表样式

```html
<ul class="list-disc list-inside">
  <li>无序列表，圆点标记</li>
  <li>list-inside 让标记在内容框内</li>
</ul>

<ol class="list-decimal list-inside">
  <li>有序列表，数字标记</li>
  <li>适合步骤说明</li>
</ol>

<ul class="list-none">
  <li>清除默认列表样式，自己用 flex 或 grid 重新排版</li>
</ul>
```

`list-inside` 和 `list-outside` 控制标记符号在内容框的内部还是外部。

## 实战：优化产品页的文字排印

把上一章的产品页拿来，优化文字层级：

```html
<!DOCTYPE html>
<html lang="zh-CN">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>星光科技 · 智能灯</title>
  <script src="https://unpkg.com/@tailwindcss/browser@4"></script>
</head>
<body>
  <nav class="bg-white border-b border-gray-100">
    <div class="max-w-5xl mx-auto flex items-center justify-between px-6 py-4">
      <span class="text-xl font-bold text-gray-900">星光科技</span>
      <div class="flex gap-6 text-gray-600">
        <a href="#" class="hover:text-gray-900">产品</a>
        <a href="#" class="hover:text-gray-900">特性</a>
        <a href="#" class="hover:text-gray-900">联系我们</a>
      </div>
    </div>
  </nav>

  <main class="max-w-5xl mx-auto px-6 py-16">
    <!-- Hero 区域 -->
    <div class="text-center">
      <h1 class="text-5xl font-extrabold text-gray-900 tracking-tight">
        智能台灯 <span class="text-blue-600">Lumina</span>
      </h1>
      <p class="mt-6 text-xl text-gray-500 leading-relaxed max-w-2xl mx-auto">
        光线随你而变。一盏懂你的台灯，用 AI 算法模拟自然光的变化，让每一刻都有最适合的光线。
      </p>
      <button class="mt-8 px-8 py-4 bg-blue-600 text-white text-lg font-semibold rounded-xl hover:bg-blue-700">
        立即购买
      </button>
    </div>

    <!-- 特性列表 -->
    <div class="mt-24">
      <h2 class="text-3xl font-bold text-gray-900 text-center">
        为什么选择 Lumina
      </h2>
      <div class="mt-12 grid grid-cols-3 gap-8">
        <div class="text-center">
          <h3 class="text-xl font-semibold text-gray-900">AI 调光</h3>
          <p class="mt-3 text-gray-500 leading-relaxed">
            内置传感器实时感知环境光线，自动调整亮度和色温。
          </p>
        </div>
        <div class="text-center">
          <h3 class="text-xl font-semibold text-gray-900">护眼模式</h3>
          <p class="mt-3 text-gray-500 leading-relaxed">
            无频闪、低蓝光，通过德国莱茵 TÜV 护眼认证。
          </p>
        </div>
        <div class="text-center">
          <h3 class="text-xl font-semibold text-gray-900">语音控制</h3>
          <p class="mt-3 text-gray-500 leading-relaxed">
            支持 Siri、小爱同学、Google Assistant 语音指令。
          </p>
        </div>
      </div>
    </div>
  </main>
</body>
</html>
```

看这里文字层级的编排：

- `text-5xl font-extrabold tracking-tight` —— 醒目的 Hero 标题，`tracking-tight` 让字母间距紧凑
- `text-xl text-gray-500 leading-relaxed` —— 副标题，宽松行高便于阅读
- `text-3xl font-bold` —— 段落标题，比 Hero 小但依然突出
- `text-xl font-semibold` —— 卡片标题
- `text-gray-500 leading-relaxed` —— 卡片正文，灰色降低视觉权重

> [!summary] 本章小结
> - 字体用 `font-sans/serif/mono` 三种预设，也可通过 `@theme` 自定义
> - 字号从 `text-xs` 到 `text-9xl` 共 18 级，页面用 3~4 种就够
> - 字重 `font-bold` 做标题，`font-normal` 做正文
> - 行高 `leading-relaxed` 适合大段文字
> - `truncate` 和 `line-clamp` 控制文字溢出

---

文字有了层次感，但页面的结构还是平的。下一篇，我们用 **Flex 和 Grid** 给页面搭骨架。


---

> 作者: Aphros  
> URL: https://blog.papergate.top/posts/03.%E6%96%87%E5%AD%97%E6%8E%92%E5%8D%B0%E5%AD%97%E9%87%8C%E8%A1%8C%E9%97%B4%E7%9A%84%E7%BE%8E%E5%AD%A6/  

