CSS font-weight属性详解:粗细控制与实现原理

9 次阅读

CSS 中的 font-weight 属性用于控制文本字形的粗细,是文字排版中非常常用的属性。很多开发者只熟悉 normal 和 bold 两个值,但实际上 font-weight 支持数字权重、关键字以及可变字体范围等多种形式。理解它的工作机制,可以更准确地控制网页字体效果,也能避免设置了 700 却看起来没有明显变化等常见问题。

font-weight属性的基本作用

font-weight 用于指定字体的字重,也就是字形笔画的粗细程度。它不会改变字体大小,主要影响文字本身的视觉重量。

基本语法如下:

CSS
.selector {
    font-weight: value;
}

例如:

CSS
p {
    font-weight: 400;
}

strong {
    font-weight: 700;
}

通常情况下,400 对应普通字重,700 对应粗体,但最终效果还取决于当前使用的字体是否提供对应字重。

常见示例:

CSS
.title {
    font-weight: bold;
}

.description {
    font-weight: normal;
}

也可以使用数字表示:

CSS
.title {
    font-weight: 700;
}

.description {
    font-weight: 400;
}

数字写法在实际项目中更加灵活,特别是在需要使用多种字体粗细或者配合字体设计规范时。

font-weight有哪些常用取值

font-weight 的取值主要可以分为关键字和数字两大类。

normal

normal 表示正常字重,通常对应数值 400。

CSS
body {
    font-weight: normal;
}

在大多数普通字体中,普通正文都会采用这个字重。

bold

bold 表示粗体,通常对应数值 700。

CSS
h1 {
    font-weight: bold;
}

需要注意的是,bold 并不是一个固定的“加粗算法”。浏览器会根据字体本身提供的字重以及字体匹配规则选择合适的字形。

bolder

bolder 表示相对于父元素使用更粗的字重。

例如:

CSS
.parent {
    font-weight: 400;
}

.child {
    font-weight: bolder;
}

它并不是简单地执行“父元素数值 + 100”。浏览器会根据 CSS 字重层级进行匹配。

lighter

lighter 与 bolder 相反,用于选择相对于父元素更细的字重。

CSS
.parent {
    font-weight: 700;
}

.child {
    font-weight: lighter;
}

这种写法适合强调父子元素之间的相对粗细关系,但如果设计稿要求精确控制字重,通常直接使用具体数值更加直观。

数字字重是什么意思

font-weight 可以使用 1 到 1000 的整数值。

CSS
.text-regular {
    font-weight: 400;
}

.text-medium {
    font-weight: 500;
}

.text-semibold {
    font-weight: 600;
}

.text-bold {
    font-weight: 700;
}

.text-heavy {
    font-weight: 800;
}

传统字体体系中经常使用以下对应关系:

数值常见名称常见用途
100Thin极细文字
200Extra Light特细
300Light细体
400Normal / Regular正文
500Medium中等粗细
600Semi Bold半粗
700Bold粗体
800Extra Bold特粗
900Black黑体字重

需要特别注意,这张表主要用于理解常见字体命名习惯,并不意味着所有字体都完整提供这些字重。

例如某款字体只有 Regular 和 Bold 两套字体文件,那么设置:

CSS
font-weight: 500;

并不一定能够得到真正独立的 Medium 字形。

font-weight的数字范围与字体支持

现代 CSS 允许 font-weight 使用 1 到 1000 的整数范围。

例如:

CSS
.title {
    font-weight: 650;
}

但是,“CSS 支持 650”和“字体拥有 650 这个独立字重”是两回事。

如果使用的是普通静态字体,而字体文件只提供 400 和 700,浏览器需要根据字体匹配规则选择可用字重。

因此下面这种情况很常见:

CSS
.text {
    font-family: Arial, sans-serif;
    font-weight: 600;
}

实际显示效果可能并不是一个真正独立的 600 字重。

而可变字体则能够在一定范围内提供连续的字重变化。例如字体定义了:

CSS
font-weight: 200 900;

那么浏览器可以根据指定值在这个范围内选择相应的字重。

font-weight与字体文件之间的关系

理解 font-weight,不能只看 CSS,还需要考虑字体文件。

例如网页加载了以下字体:

CSS
@font-face {
    font-family: "DemoFont";
    src: url("regular.woff2") format("woff2");
    font-weight: 400;
}

@font-face {
    font-family: "DemoFont";
    src: url("bold.woff2") format("woff2");
    font-weight: 700;
}

此时:

CSS
.text1 {
    font-family: "DemoFont";
    font-weight: 400;
}

.text2 {
    font-family: "DemoFont";
    font-weight: 700;
}

浏览器可以分别使用两个字体文件。

如果代码写成:

CSS
.text3 {
    font-family: "DemoFont";
    font-weight: 600;
}

但没有定义 600 字体资源,浏览器就需要按照字体匹配规则寻找最合适的可用字重。

这也是为什么有时候修改 font-weight: 500 后,页面看起来和 400 几乎没有区别。

浏览器如何匹配font-weight

font-weight 并不是简单地告诉浏览器“把文字加粗多少”。

浏览器首先需要根据 font-family、字体样式和字重等条件确定使用哪一个字体实例或字体文件。

对于静态字体,如果请求的字重不存在,浏览器会寻找接近的可用字重。

例如字体只有:

400
700

而 CSS 设置:

CSS
font-weight: 600;

浏览器并不会凭空生成一个真正的 600 字体文件,而是根据字体匹配规则选择可用字重。

这也是字体设计与 CSS 属性之间的重要区别:

CSS 中声明的字重范围,不等于字体文件实际拥有的字重数量。

font-weight与font-family必须结合使用

单独研究 font-weight 容易忽略字体本身的影响。

例如:

CSS
.title {
    font-family: Arial, sans-serif;
    font-weight: 700;
}

和:

CSS
.title {
    font-family: "某款中文字体", sans-serif;
    font-weight: 700;
}

即使两者都设置为 700,最终视觉效果也可能存在明显差异。

原因在于不同字体的字形设计、笔画结构和字重分布并不相同。

尤其是中文网页中,不同字体对 400、500、700 等字重的视觉表现差异可能比英文字体更加明显。

因此进行网页视觉还原时,不能只复制设计稿中的 font-weight 数值,还需要确保字体资源一致。

font-weight与font-style有什么区别

font-weight 和 font-style 都属于字体相关属性,但作用完全不同。

CSS
font-weight: 700;
font-style: italic;

其中:

  • font-weight 控制字体粗细;

  • font-style 主要控制正常、斜体等样式。

例如:

CSS
em {
    font-style: italic;
}

而:

CSS
strong {
    font-weight: 700;
}

两者可以同时使用:

CSS
.title {
    font-weight: 700;
    font-style: italic;
}

这样就能得到粗体斜体效果。

font-weight与文字大小没有直接关系

有些初学者会认为文字越粗,占用空间就一定越大。实际上,font-weight 主要改变字形设计,不负责设置字体尺寸。

字体大小由:

CSS
font-size

控制。

例如:

CSS
.title {
    font-size: 32px;
    font-weight: 700;
}

这里 32px 决定文字大小,而 700 决定字重。

如果希望改变文字尺寸,可以修改:

CSS
font-size: 24px;

如果希望改变粗细,则修改:

CSS
font-weight: 600;

两者职责不同。

font-weight与HTML语义标签的关系

HTML 中的 通常具有强调语义,而浏览器默认样式一般会显示为粗体。

例如:

HTML
重要内容

通常相当于视觉上的粗体效果。

但 CSS 可以覆盖其默认样式:

CSS
strong {
    font-weight: 500;
}

因此不能简单认为 永远等于 font-weight: 700。

同样, 和 font-weight 也不是完全相同的概念。HTML 标签承担内容语义,而 CSS 属性负责视觉表现。

如果内容确实具有重要性,应该优先考虑使用语义化 HTML,再通过 CSS 控制具体显示效果。

如何实现不同程度的文字粗细

实际网页通常不会只使用普通和粗体两种状态,而是根据内容层级选择不同字重。

例如:

CSS
body {
    font-weight: 400;
}

.subtitle {
    font-weight: 500;
}

.section-title {
    font-weight: 600;
}

.main-title {
    font-weight: 700;
}

这样的设计可以形成比较清晰的视觉层级。

正文使用 400,辅助信息可以使用 400 或 500,小标题可以使用 600,主要标题则可以使用 700。

不过具体选择仍然应该根据字体实际效果调整,而不是机械套用数字。

使用@font-face定义不同字重

如果项目需要加载多个字体文件,可以分别声明字体权重。

CSS
@font-face {
    font-family: "MyFont";
    src: url("/fonts/myfont-regular.woff2") format("woff2");
    font-weight: 400;
    font-style: normal;
}

@font-face {
    font-family: "MyFont";
    src: url("/fonts/myfont-medium.woff2") format("woff2");
    font-weight: 500;
    font-style: normal;
}

@font-face {
    font-family: "MyFont";
    src: url("/fonts/myfont-bold.woff2") format("woff2");
    font-weight: 700;
    font-style: normal;
}

使用时只需要指定:

CSS
.title {
    font-family: "MyFont", sans-serif;
    font-weight: 700;
}

浏览器会根据 font-weight 找到对应的字体资源。

这种方式比通过 CSS 对普通字体进行简单视觉加粗更加可靠。

可变字体中的font-weight

可变字体是现代字体技术中的重要应用场景。

传统字体通常需要分别准备:

Regular
Medium
Bold

等多个文件。

可变字体可以在一个字体文件中保存一系列变化轴,例如:

CSS
@font-face {
    font-family: "VariableFont";
    src: url("/fonts/variable.woff2") format("woff2");
    font-weight: 100 900;
}

随后可以使用:

CSS
.text {
    font-family: "VariableFont", sans-serif;
    font-weight: 625;
}

理论上可以获得更加连续的字重变化。

这种能力特别适合设计系统、响应式界面和需要大量字体层级的应用。

为什么font-weight设置后没有变化

这是开发过程中非常常见的问题。

字体没有对应字重

例如:

CSS
font-weight: 600;

但当前字体只有 400 和 700,浏览器可能使用其他可用字重进行匹配。

实际加载的字体不是预期字体

如果自定义字体加载失败:

CSS
font-family: "MyFont", sans-serif;

浏览器会回退到 sans-serif。

此时即使设置:

CSS
font-weight: 700;

看到的也可能是备用字体的粗体效果。

可以通过浏览器开发者工具检查实际使用的字体。

字体文件声明错误

例如字体文件实际上是 Bold,却错误声明成:

CSS
font-weight: 400;

那么浏览器的字体匹配就可能出现异常。

@font-face 中的 font-weight 应该与字体资源实际对应的字重保持一致。

中文字体字重差异不明显

某些中文字体在 400 和 500 之间视觉差距非常小。

这种情况下,即使 CSS 设置发生变化,肉眼也可能很难发现。

CSS被其他规则覆盖

例如:

CSS
.title {
    font-weight: 700;
}

.container .title {
    font-weight: 400;
}

后者具有更高的选择器优先级,最终可能使用 400。

排查时可以打开开发者工具,查看 Computed 面板中的 font-weight 最终计算值。

font-weight继承机制

font-weight 是可以继承的。

例如:

CSS
.parent {
    font-weight: 600;
}

子元素如果没有单独设置:

CSS
.child {
}

通常会继承父元素的字重。

HTML:

HTML
 class="parent">
     class="child">这段文字会继承父元素字重

如果子元素需要使用不同字重,可以显式指定:

CSS
.child {
    font-weight: 400;
}

在大型项目中,如果发现某段文字莫名其妙变粗,除了检查自身 CSS,还应该检查父级元素是否设置了 font-weight。

使用font-weight时的性能注意事项

字体文件本身可能比较大,尤其是中文字体。

如果项目同时加载:

400
500
600
700
800

多个静态字体文件,会增加页面资源请求和字体数据传输量。

实际开发中应该根据设计需求加载必要的字重。

例如普通内容网站可能只需要:

400
700

如果使用可变字体,则可以考虑使用单个字体文件覆盖一个字重范围,但需要结合字体文件体积和浏览器支持情况进行权衡。

此外,合理使用 font-display 也有助于优化字体加载期间的页面显示体验。

font-weight的实际应用建议

对于常规网站,可以采用相对简单的字体层级:

CSS
body {
    font-weight: 400;
}

h1 {
    font-weight: 700;
}

h2 {
    font-weight: 600;
}

button {
    font-weight: 500;
}

对于设计系统,则可以将字重统一定义:

CSS
:root {
    --font-weight-regular: 400;
    --font-weight-medium: 500;
    --font-weight-semibold: 600;
    --font-weight-bold: 700;
}

body {
    font-weight: var(--font-weight-regular);
}

button {
    font-weight: var(--font-weight-medium);
}

h2 {
    font-weight: var(--font-weight-semibold);
}

h1 {
    font-weight: var(--font-weight-bold);
}

这样做可以减少项目中的魔法数字,也方便后续统一调整视觉规范。

font-weight常见误区

第一,不要认为 500 一定比 400 明显粗很多。最终效果由字体本身决定。

第二,不要认为设置 700 就一定会加载 Bold 字体。如果没有对应字体资源,浏览器会按照字体匹配规则选择其他可用字体。

第三,不要把 font-weight 当作文字大小属性。字体大小应该通过 font-size 控制。

第四,不要为了视觉上的粗体效果而忽略 HTML 语义。重要内容应该合理使用 等语义化标签。

第五,不要盲目加载大量字体文件。字重越多并不意味着页面效果一定越好,还需要考虑性能和实际设计需求。

总结

font-weight 是 CSS 字体控制体系中的核心属性,既可以使用 normal、bold 等关键字,也可以使用 1 到 1000 的数字表示字重。常见的 400、500、600、700 分别对应不同程度的字体粗细,但它们最终呈现什么效果,与字体文件是否提供相应字重密切相关。

普通静态字体主要依靠浏览器进行字重匹配,而可变字体可以在指定范围内提供更加细致的字重控制。实际开发中,如果出现 font-weight 设置后效果不明显的问题,应重点检查字体资源、@font-face 声明、字体回退、CSS 覆盖以及父元素继承等因素。

掌握 font-weight 的关键并不是记住几个数字,而是理解“CSS请求的字重”和“字体实际提供的字重”之间的关系。只有将 CSS 属性、字体文件和页面设计规范结合起来,才能实现稳定、准确的文字粗细控制。