font-feature-settings仅能启用或禁用字体文件中已内置的opentype特性,无法添加缺失特性、生成新规则或修补字体缺陷;它不控制字重、字形倾斜等变体,也不支持通过html或js动态注入特性。

你不能用 HTML “加” OpenType 特性,font-feature-settings 也不是万能开关——它只对字体文件里本来就有的特性起作用。
font-feature-settings 能做什么、不能做什么
这个 CSS 属性只是告诉浏览器:“如果当前字体支持 liga,就启用它;如果支持 kern,也一并启用”。它不生成新规则,也不修补缺失的特性。
- ✅ 可以启用/禁用已存在的特性,比如
"liga" 1或"kern" 0 - ❌ 无法让一个没做字距调整(
kern)表的字体突然“有字距” - ❌ 无法通过 HTML 标签或内联 style 添加任何 OpenType 行为
- ⚠️ 如果字体不带
onum(旧式数字),写font-feature-settings: "onum" 1完全无效
优先用 font-variant-* 这类语义化属性
比起直接操作四字符标签,现代 CSS 提供了更可靠、更易读的控制方式,而且浏览器兼容性更好。
-
font-kerning: normal比"kern" 1更直观,且自动适配字体能力 -
font-variant-ligatures: common-ligatures等价于"liga" 1,但可读性强、不易拼错 -
font-variant-numeric: oldstyle-nums是"onum" 1的语义替代,推荐在支持环境下使用 - 注意:这些属性是“建议式”的——浏览器仍会检查字体是否真有对应特性,没有就不生效
如何确认字体到底支不支持某个特性
光看字体名或文件名没用,必须验证。最直接的方式是用浏览器开发者工具 + 实际测试。
- 在 DevTools 的 Elements 面板中选中文本节点,查看 Computed 标签页里的
font-feature-settings是否被应用(但注意:这里只显示“写了什么”,不显示“有没有效”) - 更有效的方法:写两段对比文本,一段启用
"kern" 1,一段禁用"kern" 0,观察字母对如 “AV”、“To”、“Wa” 的间距变化 - 用在线工具如 opentype.js 解析字体文件,检查
GSUB和GPOS表是否包含目标特性(例如kern属于GPOS) - 部分字体厂商会在官网文档中标明支持的 OpenType 特性列表,比如 Adobe Fonts 页面会列出
liga、ss01等
别碰 JavaScript 动态改字体文件这种事
网上有些文章提到用 opentype.js 加载字体、修改查找表、再导出新字体——这在技术上可行,但实际项目中等于自找麻烦。
- 生成的新字体体积变大,加载更慢
- 修改后的字体可能破坏 hinting、subpixel 渲染或可访问性元数据
- 无法保证所有浏览器正确解析你手动生成的二进制结构
- 每次更新字体都要重新跑脚本,维护成本极高
- 真正该做的,是选对字体,或和字体设计师沟通补特性,而不是在前端硬拗
OpenType 特性不是 CSS 属性,它是字体文件的“内置程序”。你调用它,但不能重写它。最容易被忽略的一点是:很多免费字体压根没做 kern 表,这时候再怎么写 font-kerning: normal 都没用——得换字体,不是调样式。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











