应在:root中定义语义化字体变量(如--font-sans、--font-serif、--font-mono),值为带引号的完整字体栈并含通用族名;字号等用独立变量(如--fs-base)配合rem和clamp()实现响应式;var()仅可整栈引用,不可拼接或用于@font-face。

怎么在 :root 里定义字体相关的 CSS 变量
直接在 :root 里声明语义化变量,别写 --font1 或 --mainFont 这种模糊名。变量值必须是完整、可直接用于 font-family 的字符串,包括引号(如果含空格或特殊字符)。
常见错误:漏掉引号导致解析失败;把字体堆叠列表整个塞进一个变量里,后续无法单独覆盖某一项。
-
--font-sans应该是"Inter", "Segoe UI", system-ui, sans-serif,不是只写Inter -
--font-serif推荐带引号:"Charter", "Noto Serif", serif -
--font-mono别省略回退链:"SFMono-Regular", Menlo, monospace - 字号、行高、字重等拆成独立变量,例如:
--fs-base: 1rem、--lh-base: 1.5、--fw-normal: 400
如何在 font-family 中安全使用 var() 函数
var() 只能用在 font-family 值的任意位置,但不能“拼接”——比如 var(--font-sans), var(--font-mono) 是合法的,但 var(--font-sans) var(--fw-bold) 会报错,因为浏览器不支持把变量当 token 拆开解析。
真正生效的前提是:变量值本身已包含完整的字体栈,且末尾有通用族名(sans-serif 等),否则 fallback 机制失效。
- ✅ 正确:
font-family: var(--font-sans); - ❌ 错误:
font-family: var(--font-sans), var(--fw-bold);(var(--fw-bold)不是字体名) - ⚠️ 注意:
font-family: var(--font-sans), monospace;是冗余的,因为--font-sans末尾已有sans-serif - 如果要用不同字重,得另配
@font-face并用独立变量控制,例如:--fw-heading: 700→font-weight: var(--fw-heading)
为什么 @font-face 里不能用 CSS 变量
@font-face 是 CSS 的“编译期”规则,而 var() 是运行时计算的。浏览器在解析 @font-face 时根本不会展开变量,直接当作无效值丢弃。
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
这意味着你没法用 var(--font-name) 动态注册字体族名,所有 font-family 字符串必须硬编码在 @font-face 的 font-family 属性中。
- ✅ 正确写法:
@font-face { font-family: "MyCustomFont"; src: url("./fonts/myfont.woff2") format("woff2"); } - ❌ 无效写法:
@font-face { font-family: var(--font-custom); ... }(会被忽略) - 变通方案:用构建工具(如 PostCSS)做变量替换,或手动维护两套命名:一套给
@font-face,一套给:root变量引用
字体变量 + 响应式缩放怎么配合不翻车
单纯用 var(--fs-base) 不解决响应式问题。要让字体随屏幕变化,得把变量值本身设为响应式单位(如 clamp() 或 vw),或者用媒体查询重置变量值。
最稳的方式是:根元素 html 的 font-size 用 clamp() 控制,其余字体变量全用 rem,这样一次调整就全局生效。
- 推荐基础设置:
html { font-size: clamp(14px, 1.5vw, 18px); } - 然后所有字体变量基于 rem:
--fs-h1: 2.5rem、--fs-p: 1rem - 避免混用:
var(--fs-base)是16px,又在某处写font-size: calc(var(--fs-base) * 1.2)—— 这样失去 rem 的继承优势,也难维护 - 深色模式切换字体颜色?可以,但别动字体本身;用
--text-color配合color: var(--text-color)更安全
真正容易被忽略的是:字体变量一旦定义在 :root,它就参与级联和继承,但不会自动响应 DOM 结构变化。比如你在某个组件里改了 --font-sans,它的子元素会立刻生效,但父元素或兄弟节点不会——这个“局部覆盖”的边界感,比颜色变量更难调试。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










