font-feature-settings: "liga" 1, "dlig" 1 才规范生效,需字体本身包含对应连字字形;"liga" 控制fi/fl等基础连字,"dlig" 控制ct/st等装饰性连字,无效时优先检查字体支持与加载状态。

font-feature-settings 启用连字:liga 和 dlig 怎么写才生效
font-feature-settings 不是“开个开关就自动变好看”的属性,它只向字体引擎传递指令,最终是否出效果,取决于字体文件里有没有打包对应特性。
比如 Roboto 默认版(Google Fonts 上最常加载的)就不含 dlig,写了也白写;而 IBM Plex Sans 或 Source Serif Pro 的完整 WOFF2 版本则明确支持 liga、dlig、clig。
- 写法必须是
"liga" 1,不是"liga" on(虽然部分浏览器兼容,但不符合规范,Chrome DevTools 会标为 strike-through) - 多个特性用逗号分隔:
"liga" 1, "dlig" 1, "clig" 1 -
liga控制基础连字(如 fi、fl),大多数西文字体都带;dlig是离散/装饰性连字(如 ct、st、Th),需字体额外设计支持 - 如果页面没变化,先打开 Chrome DevTools → Elements → Computed → 找
font-feature-settings,看值是否被解析(无效写法会灰掉)
启用替代字符:smcp、ss01、frac 这些怎么选和验证
替代类特性不改变语义,只替换字形,所以必须确认字体本身提供这些字形——否则静默忽略,不报错也不警告。
-
"smcp" 1把小写字母换成小型大写字母(不是缩放,而是独立字形),适合标题或强调段落;但像Inter这类免费字体默认不含smcp字形,得查其 GitHub release notes 或用 FontDrop 测 -
"ss01" 1到"ss20" 1是样式集(Stylistic Sets),编号完全由字体设计师定义,没有通用含义。比如FF Meta Variable的ss05可能是圆角数字,而Work Sans根本没实现任何ssXX -
"frac" 1启用自动分数(如把 1/2 渲染成 ½),仅对斜杠分隔的纯数字有效,且依赖字体内置分数字形;"lnum" 1或"onum" 1切换数字风格,但不会改变数字宽度,要等宽得配"tnum" 1
验证方式很简单:写一段含目标字符的文本(如 “fi fl st 1/2 abc”),然后在 DevTools 的 Fonts 面板里点开当前渲染的字体,看“OpenType Features”列表里对应项是否勾选。
为什么写了 font-feature-settings 却没反应?常见失效原因
这不是 CSS 写错了,大概率是链路断在了前面:
- 加载的字体文件格式不支持该特性:WOFF 比 WOFF2 支持的 OpenType 特性少,尤其
cvXX(字符变体)和高级ssXX在 WOFF 中常被裁掉 -
@font-face没声明font-feature-settings所需特性:某些字体厂商会把特性拆到不同文件(如“Regular + liga” vs “Regular + ss05”),你得确保引入的是那个带特性的版本 - 字体未实际加载成功:Network 面板里检查字体请求状态,404 或 CORS 会静默失败,
font-feature-settings依然解析,但无字体可用 - 浏览器限制:macOS Safari 对
cvXX和部分ssXX支持滞后,text-rendering: optimizelegibility有时能绕过部分限制,但不可靠
font-feature-settings 和 font-variant-ligatures 的关系
font-variant-ligatures 是更高层、更语义化的替代方案,应该优先用它:
-
font-variant-ligatures: common-ligatures;等价于"liga" 1 -
font-variant-ligatures: discretionary-ligatures;≈"dlig" 1 - 它的好处是可继承、有明确 fallback 行为,而且部分旧浏览器(如 IE)虽不支持
font-feature-settings,但会忽略该属性而非崩坏
但注意:
-
font-variant-ligatures无法启用ss01、frac、smcp这类非 ligature 类特性 - 当你需要组合控制(比如同时开
liga、关kern、开ss03),还是得回到font-feature-settings
真正容易被忽略的一点:字体特性不是“渲染开关”,而是“字形选择指令”。它不生成新字形,只从已有字形池里挑。如果池子空,再怎么调参数也没用。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











