CSS文本与字体排版

一、字体样式(控制文字本身的样子)

1.1 设置字体族 font-family

匹配规则:决定文字使用什么字体。可以指定多个字体作为备选(用逗号隔开),浏览器从左到右依次尝试,直到找到系统里存在的那个。中文字体必须加引号,英文字体如果名字有空格也要加引号。

<p class="sans">这是无衬线字体,现代感强</p>
<p class="serif">这是衬线字体,适合正文阅读</p>
<p class="mono">这是等宽字体,适合代码</p>
.sans {
    font-family: "PingFang SC", "Microsoft YaHei", sans-serif;  /* 中文用苹方/雅黑,都没有就回退到系统无衬线 */
}
.serif {
    font-family: Georgia, "Times New Roman", serif;  /* 衬线字体 */
}
.mono {
    font-family: "Fira Code", "Courier New", monospace;  /* 等宽字体 */
}

结果:第一段显示为现代圆润的无衬线字体,第二段显示为带笔锋装饰的衬线字体,第三段显示为每个字母宽度相同的等宽字体。

1.2 设置字体大小 font-size

匹配规则:控制文字的大小。可以使用 px(绝对)、rem(相对于根元素)、em(相对于父元素)、%(相对于父元素)等单位。

<p class="small">小号文字 12px</p>
<p class="normal">正常文字 16px(浏览器默认)</p>
<p class="large">大号文字 2rem(约 32px)</p>
.small {
    font-size: 12px;
}
.normal {
    font-size: 16px;  /* 大多数浏览器默认就是 16px,不写也行 */
}
.large {
    font-size: 2rem;  /* 16px × 2 = 32px */
}

结果:三个段落文字大小依次增大。实际开发中推荐用 rem,方便用户调整浏览器字号时整体缩放。

1.3 设置字体粗细 font-weight

匹配规则:控制文字的粗细。可以用数值(100~900,整百递增)或关键字(normal = 400,bold = 700)。

<p class="light">细体 300</p>
<p class="normal">常规 400(默认)</p>
<p class="bold">粗体 700(加粗)</p>
<p class="black">特粗 900</p>
.light {
    font-weight: 300;
}
.normal {
    font-weight: normal;  /* 等价于 400 */
}
.bold {
    font-weight: bold;    /* 等价于 700 */
}
.black {
    font-weight: 900;
}

结果:文字从细到粗依次变浓。注意:有些字体不支持所有粗细值,设置后可能不会变化。

1.4 设置字体样式(斜体) font-style

匹配规则:控制文字是否倾斜。通常用来表示强调、书名或引用。

<p class="italic">这段文字是斜体</p>
<p class="normal">这段文字是正体(默认)</p>
.italic {
    font-style: italic;  /* 使用字体的斜体版本 */
}
.normal {
    font-style: normal;  /* 恢复正常(取消斜体) */
}

结果:第一段倾斜,第二段正常。

1.5 字体简写 font(合并写法)

匹配规则:font-style、font-weight、font-size、line-height、font-family 的简写。必须按顺序写,且 font-size 和 font-family 是必填项。

/* 顺序:style weight size/line-height family */
p {
    font: italic bold 16px/1.8 "PingFang SC", sans-serif;
}

结果:等价于分别写了 font-style: italic; font-weight: bold; font-size: 16px; line-height: 1.8; font-family: “PingFang SC”, sans-serif;。节省代码量,但不建议新手用(容易写错顺序)。

二、文本布局(控制文字的排列方式)

2.1 设置文字水平对齐 text-align

匹配规则:控制文字在块级元素内的水平对齐方式。常用值:left(左对齐,默认)、center(居中)、right(右对齐)、justify(两端对齐——左右边缘都贴齐,适合大段文章)。

<div class="left">我是左对齐(默认)</div>
<div class="center">我是居中对齐</div>
<div class="right">我是右对齐</div>
<div class="justify">我是两端对齐,每行文字左右都贴边,适合长文章阅读,看起来更整齐。</div>
.left {
    text-align: left;
}
.center {
    text-align: center;
}
.right {
    text-align: right;
}
.justify {
    text-align: justify;
    width: 300px;
}

结果:文字分别靠左、居中、靠右、两端对齐。

2.2 设置文字装饰(下划线/删除线) text-decoration

匹配规则:给文字加装饰线。常用值:none(去掉下划线,用于超链接)、underline(下划线)、line-through(删除线)、overline(上划线)。

<a href="#" class="link">我是超链接,默认有下划线</a>
<a href="#" class="no-underline">我去掉了下划线</a>
<p class="del">原价 199 元</p>
<p class="sale">现价 99 元(带删除线)</p>
.link {
    text-decoration: underline;  /* 超链接默认就有,可以不写 */
}
.no-underline {
    text-decoration: none;  /* 最常用:去掉 a 标签的下划线 */
}
.del {
    text-decoration: line-through;  /* 删除线 */
}
.sale {
    text-decoration: line-through;
    color: #999;
}

结果:第一个链接有下划线,第二个没有。原价文字带删除线,表示已被划掉。

2.3 设置行高 line-height

匹配规则:控制两行文字之间的垂直距离(行距)。数值不带单位时表示当前字号的倍数(如 1.5 表示行高是字号的 1.5 倍)。行高也常用于单行文字的垂直居中。

<p class="tight">这是紧凑行高(1.2),文字挤在一起,阅读费力。</p>
<p class="comfort">这是舒适行高(1.8),适合正文阅读,眼睛不累。</p>
<div class="center-line">我用行高实现了垂直居中</div>
.tight {
    line-height: 1.2;  /* 字号 × 1.2,很挤 */
    font-size: 16px;
}
.comfort {
    line-height: 1.8;  /* 字号 × 1.8,宽松舒适 */
    font-size: 16px;
}
.center-line {
    line-height: 60px;  /* 行高等于容器高度,文字就垂直居中了 */
    height: 60px;
    background: #f0f0f0;
    text-align: center;
    border: 1px solid #ccc;
}

结果:第一段文字紧凑,第二段宽松。第三个盒子中的文字在 60px 高的容器中垂直居中。

2.4 设置字间距 letter-spacing

匹配规则:控制字符之间的间距(俗称”字距”)。正值让文字变疏,负值让文字变紧。

<p class="normal">正常字间距</p>
<p class="loose">疏散字间距(常用于标题)</p>
<p class="tight">紧凑字间距</p>
.normal {
    letter-spacing: normal;  /* 默认,0 */
}
.loose {
    letter-spacing: 4px;  /* 每个字之间增加 4px */
}
.tight {
    letter-spacing: -1px;  /* 字距缩小 1px,慎用负值 */
}

结果:第二段每个字之间的距离明显变大,适合做标题增加”高级感”。第三段文字略显拥挤。

三、文本溢出与换行(防止文字把布局撑坏)

3.1 设置换行方式 word-break

匹配规则:控制长单词或 URL 在容器边缘如何换行。默认情况下,长英文单词不会断,会溢出容器。

<div class="break-all">supercalifragilisticexpialidocious</div>
<div class="break-word">supercalifragilisticexpialidocious</div>
<div class="keep-all">这是一段很长的中文文字,它默认就可以在任意字符处换行</div>
.break-all {
    width: 100px;
    border: 1px solid #ccc;
    word-break: break-all;  /* 强行在任意字符处断开,连单词都会劈开 */
}
.break-word {
    width: 100px;
    border: 1px solid #ccc;
    word-break: break-word;  /* 尽量完整显示单词,实在放不下再断开 */
}
.keep-all {
    width: 100px;
    border: 1px solid #ccc;
    word-break: keep-all;  /* 中文/日文/韩文不断词,英文不断单词 */
}

结果:第一个盒子里的长单词被硬生生劈成多段,第二个盒子尽量保持单词完整再换行。

3.2 控制空白字符和换行 white-space

匹配规则:控制代码中的空格、换行符是否在页面上显示。默认情况下,连续空格会被压缩成一个,换行符会被忽略。

<div class="normal">Hello     World
换行被忽略了</div>
<div class="pre">Hello     World
换行保留了</div>
<div class="nowrap">这段文字很长很长,但就是不换行,会溢出容器</div>
.normal {
    white-space: normal;  /* 默认值:压缩空格,忽略换行 */
}
.pre {
    white-space: pre;     /* 保留空格和换行(类似 <pre> 标签) */
}
.nowrap {
    white-space: nowrap;  /* 强制不换行,超出容器也不换,搭配 text-overflow 使用 */
    width: 150px;
    border: 1px solid #ccc;
    overflow: hidden;     /* 配合溢出隐藏 */
}

结果:第一个盒子的多个空格被压缩成一个,换行失效。第二个盒子保留了多个空格和换行。第三个盒子文字死活不换行,直接溢出(或隐藏)。

3.3 溢出显示省略号(单行截断) text-overflow: ellipsis

匹配规则:当文字超出容器宽度时,在末尾显示 …。必须同时满足:容器有固定宽度、overflow: hidden、white-space: nowrap。

<div class="ellipsis">这是一段很长很长的文字,超出容器后会在末尾显示省略号</div>
.ellipsis {
    width: 200px;
    white-space: nowrap;     /* 强制不换行 */
    overflow: hidden;        /* 溢出的藏起来 */
    text-overflow: ellipsis; /* 用 ... 表示被藏掉的部分 */
    border: 1px solid #ccc;
    padding: 8px;
}

结果:宽 200px 的盒子只显示”这是一段很长很长的文字,超…”,末尾加三个点。这是日常开发高频使用的技巧,几乎每个列表标题都会用到。

CSS文本与字体排版

https://ym.2v.nz/posts/devnotes/css/typography/
作者 羽毛
发布于 2026-09-04
许可协议 CC BY-NC-SA 4.0