如何在 CSS 中让文字加粗
font-weight 设置字母笔画的粗细。bold(等同于 700)让文字加粗,normal(等同于 400)是常规文字。
标题、<th>、<b> 和 <strong> 因为浏览器自带的样式表而默认加粗,所以要去掉加粗,就用 font-weight: normal。至于在 HTML 本身中何时使用 <b> 或 <strong>,参见 HTML 加粗。
数值刻度:100 到 900
这些数字都有字体家族遵循的标准名称:
| 值 | 常用名称 |
|---|---|
100 | Thin(极细) |
200 | Extra Light(特细) |
300 | Light(细体) |
400 | Normal / Regular(常规) |
500 | Medium(中等) |
600 | Semi Bold(半粗) |
700 | Bold(粗体) |
800 | Extra Bold(特粗) |
900 | Black / Heavy(黑体) |
1 到 1000 之间的任何数字都有效,所以 450 和 650 也可以。能不能看出区别取决于字体:浏览器只能画出字体实际包含的粗细。
system-ui 是操作系统的界面字体,通常带有很多种粗细。如果上面每一行看起来都只是两种粗细之一,说明你的系统字体只有常规体和粗体。
为什么设置了粗细却没有变化
一个字体由一组文件组成,通常每种粗细一个文件。当缺少确切的粗细时,浏览器会选择它拥有的最接近的那个:
- 对于
500,先找 500,然后找更细的,再找更粗的。 - 对于
600及以上,先找更粗的,然后找更细的。 - 如果完全没有粗体文件,大多数浏览器会把常规字母加厚,模拟出一个粗体(合成粗体)。
把一个有很多粗细的字体和 serif 对比一下,serif 在大多数系统上只有常规体和粗体:
在 serif 那一栏里,300 和 500 通常会退回到常规体,600 退回到粗体。大多数“font-weight 不起作用”的问题,答案就在这里:CSS 没错,是字体缺少这个粗细。可变字体(一个带有粗细轴的文件)能平滑地画出其粗细范围内的每一个值。
bolder 和 lighter
bolder 和 lighter 相对于元素继承到的粗细。它们会跳到下一个粗细档位,而不是增加一个固定的量:
| 父元素粗细 | bolder 得到 | lighter 得到 |
|---|---|---|
| 100 至 349 | 400 | 100 |
| 350 至 549 | 700 | 100 |
| 550 至 749 | 900 | 400 |
| 750 至 900 | 900 | 700 |
实际用法:用变量定义一套粗细
为整个网站挑选三四种粗细并给它们命名,而不是到处散落数字:
:root {
--weight-regular: 400;
--weight-medium: 500;
--weight-bold: 700;
}
body { font-weight: var(--weight-regular); }
button { font-weight: var(--weight-medium); }
h1, h2 { font-weight: var(--weight-bold); }
常见错误
- 以为每个数字看起来都不一样。 只有字体包含的粗细才会显示出区别。
- 用
<b>做按钮文字。 用font-weight设置按钮样式;<b>和<strong>留给正文文字。 - 给数字加引号。
font-weight: "700"是无效的,会被忽略。应写成font-weight: 700。 - 到处用加粗来强调。 所有东西都加粗,就没有东西突出了。正文保持 400。
- 小字用很细的粗细。 100 到 300 在小字号下很难阅读,在低对比度背景上尤其如此。
常见问题
CSS 中怎么让文字加粗?
在元素上使用 font-weight: bold;,或者等价的数值 font-weight: 700;。要去掉标题或 <strong> 的加粗,设置 font-weight: normal;(400)。
font-weight 有哪些取值?
1 到 1000 之间的数字,通常按百位写:100 极细,200 特细,300 细体,400 常规,500 中等,600 半粗,700 粗体,800 特粗,900 黑体。关键字 normal 和 bold 分别是 400 和 700,bolder 和 lighter 则相对于父元素。
font-weight bold 和 700 一样吗?
一样。bold 的计算值是 700,normal 的计算值是 400,所以两种写法的显示效果完全相同。
为什么 font-weight 500 或 600 看起来和 normal 或 bold 一样?
因为字体没有这个粗细。如果字体只提供 400 和 700,浏览器会选择最接近的可用文件,于是 500 显示得像 400,600 显示得像 700。请加载一个包含更多粗细的字体,或者使用可变字体。
应该用 CSS 的 font-weight 还是 <b> 标签?
文字重要时用 <strong>,只是样式不同时用 <b>,按钮、标签和标题这类视觉设计则用 font-weight。标签带有语义,而这个属性只管外观。