默认使用特定操作系统的系统字体可以提高性能,因为浏览器不必下载任何字体文件,它使用的是已经存在的字体。这对于任何“网络安全”字体都是如此。但是,“系统”字体的妙处在于它与当前操作系统的使用相匹配,因此它们看起来很舒服。
这些系统字体是什么?在撰写本文时,情况如下
操作系统 | 版本 | 系统字体 |
---|---|---|
macOS | Monterey | San Francisco Pro (可变) |
macOS | El Capitan | San Francisco |
macOS | Yosemite | Helvetica Neue |
macOS | Mavericks | Lucida Grande |
Windows | Vista | Segoe UI |
Windows | XP | Tahoma |
Windows | 3.1 到 ME | Microsoft Sans Serif |
Android | Ice Cream Sandwich (4.0)+ | Roboto |
Android | Cupcake (1.5) 到 Honeycomb (3.2.6) | Droid Sans |
Ubuntu | 所有版本 | Ubuntu |
快去看看代码片段吧!
前言的原因是,它显示了您可能需要回溯多远才能支持系统字体。此外,它有助于说明随着新系统版本的出现,新的字体也会出现,因此可能需要更新您的字体栈。
方法 1:元素级别的系统字体
Chrome 和 Safari 最近发布了“system-ui”,这是一个通用的字体系列,可以在以下示例中用作“-apple-system”和“BlinkMacSystemFont”的替代品。感谢 J.J. 提供的信息。
应用系统字体的一种方法是使用 font-family
属性在元素上直接调用它们。
GitHub 在其网站上使用了这种方法,在body
元素上应用系统字体
/* System Fonts as used by GitHub */
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
无论是 Medium 还是 WordPress 管理员 都使用了类似的方法,只是略有不同,最显著的是对 Oxygen Sans(为 GNU+Linux 操作系统创建)和 Cantarell(为 GNOME 操作系统创建)的支持。此代码片段还放弃了对某些类型表情符号和符号的支持
/* System Fonts as used by Medium and WordPress */
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue",sans-serif;
}
最近,Chrome 和 Safari 发布了 system-ui
,这是一个通用的字体系列,可以替代 -apple-system
和 BlinkMacSystemFont
。这意味着 GitHub 代码片段可以简化为:
/* System Fonts with system-ui */
body {
font-family: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
注意:Booking.com 发布了一篇关于 如何实施系统字体 的详细文章,该文章警告不要在 font
简写属性上使用以 -apple-system
开头的代码片段,因为某些浏览器可能会将前导字体视为将被忽略的供应商前缀。请改用 font-family
属性,或将 -apple-system
和 BlinkMacSystemFont
替换为 system-ui
。
这里明显的限制是,每次想要将此长列表字体应用于单个元素时,都必须调用它。随着时间的推移,这可能会变得很麻烦,并使您的代码比实际需要更臃肿。相反,您可以考虑为此创建一个 CSS 变量
:root {
--system-ui: system-ui, "Segoe UI", Roboto, Helvetica, Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol";
}
.element {
font-family: var(--system-ui);
}
这当然更容易阅读,而且如果字体栈需要更新,它也更容易维护。更改一次,它就会在所有地方生效!
方法 2:系统字体栈
Jonathan Neal 提供了一种 替代方法,其中使用 @font-face
声明系统字体。
/* Define the "system" font family */
@font-face {
font-family: system-ui;
font-style: normal;
font-weight: 300;
src: local(".SFNSText-Light"), local(".HelveticaNeueDeskInterface-Light"), local(".LucidaGrandeUI"), local("Ubuntu Light"), local("Segoe UI Light"), local("Roboto-Light"), local("DroidSans"), local("Tahoma");
}
/* Now, let's apply it on an element */
body {
font-family: "system-ui";
}
截至撰写本文时,此代码片段已经有一段时间没有更新,可能导致不同的字体,但我们在这里包含它的原因是为了说明定义上述代码片段中定义的 system-ui
字体系列的变体以考虑斜体、粗体和额外字重的功能。
如果我们没有 CSS 变量,这将是一种更有效的方式来编写和更新代码。
相关
- CSS 中的操作系统特定字体 – 包括用于测试正在使用的字体JavaScript 方法。
- SVG 中的系统字体
- 在 Booking.com 上实施系统字体 — 经验教训 – Booking.com 分享了他们在
font
简写属性上使用系统字体栈时遇到的经验教训。
这很有道理,我打算在我的下一个网站中使用它,但这些都是无衬线字体。我不禁想知道是否可以为系统默认衬线字体和等宽字体创建类似的栈。我可能想要在标题或引用中使用衬线字体来强调,并将等宽字体应用于
pre
和code
元素。是否有任何操作系统使用衬线字体作为系统字体?
Chris Coyier 问道
Chris,我可能错了,但我认为没有任何操作系统或 X11 桌面环境使用衬线字体作为系统字体。但是,我最初的评论可能不够清楚。我感兴趣的是使用衬线字体和等宽字体的栈,这些栈利用各种操作系统预安装的字体,用于捆绑的文字处理程序(如 WordPad)和终端模拟器(如 Terminal.app)。
例如,Windows 附带 Times New Roman 和 Courier New。OS X 附带 Apple Garamond 和 Monaco。在 4.0 版本之前,Android 除了 Droid Sans UI 字体之外,还附带 Droid Serif 和 Droid Mono。
根据初步研究,我得出了以下“系统”衬线字体和等宽字体栈。我正在从我的 Sass 变量部分中提取它们。
这些只是初步的;我离完成测试还很远。
在使用系统字体栈时,还需要考虑另一件事;
像“ex”这样的某些度量值基于第一个字体的加载!如果您需要您的字体与您的网格对齐,这一点很重要。
否则将使用另一个字体的度量值,您可能会遇到意外情况!
那个字体名称字符串从哪里来:
.SFNSText-Light
?我在字体定义文件中没有看到那个名字。只是好奇,谢谢!我认为这是操作系统使用的专用(系统)字体名称。它不会出现在系统或应用程序字体选择器中,但可以手动指定。
它是 Apple 的 San Francisco (New Sans?),用作 macOS 上的系统字体
使用本地字体将使用尽可能多的网络(无)作为例如 sans-serif - 为什么第二种方法对我来说很奇怪。如果它是关于少打字,我会使用一个 SCSS 变量 - 就像
如果我错了,请纠正我 :-)
你说得对。
使用 @font-face 方法无需 SCSS。
是的,你会对这些字体发出本地请求,但你不会遇到延迟。
值得注意的是,在较新的 Chrome 版本中,
system-ui
可以替代BlinkMacSystemFont
。iOS 怎么样?
它会支持这些语法中的任何一种吗?
它将使用哪种字体渲染?
iOS 使用 San Francisco 作为系统字体,就像 OS X El Capitan 一样。它在 Mobile Safari 上的渲染方式与桌面上的渲染方式有什么不同吗?
Booking.com 写了他们实现系统字体栈的经验,并警告不要在使用
font
而不是font-family
时将-apple-system
放在首位。body {
font: 16px/1.2 BlinkMacSystemFont, -apple-system, “Segoe UI”, Roboto, Helvetica, Arial, sans-serif;
}
vs.
body {
font-family: -apple-system, BlinkMacSystemFont, “Segoe UI”, Roboto, Helvetica, Arial, sans-serif;
}
也许这里可以有一个关于它的星号。否则,非常酷的东西!
当然,说得对!事实上,我们 发布了一个链接 到 Booking.com 的帖子在另一篇帖子中,应该也在这里指出它。考虑将这篇文章更新!
请原谅我的无知,但这比使用
serif
或sans-serif
有什么好处?这些与系统字体不匹配。例如,在我的 Mac 上,如果我使用
sans-serif
,我将获得 Helvetica,而系统字体是 San Francisco。嗨,Ben,看看我下面的评论和链接。
感谢你们两位,没有意识到这一点……会尝试一下!
“-apple-system” 和 “BlinkMacSystemFont” 被新的标准 “system-ui” 通用字体族取代。
“system-ui” 也受 Firefox 支持。
参见
https://www.chromestatus.com/feature/5640395337760768
system-ui
不受 Win7 上的 Firefox 57.0.2(64 位)支持,但我不能说 Win10 的情况。是否有类似的系统等宽字体栈?对于大多数非 Apple 平台,获取正确的字体名称相当简单,但能够通过类似 -apple-system-monospace 的标志访问 SF Mono 会很棒。到目前为止,似乎还没有关于这方面的文档。
这意味着如果你没有按照 Jonathan Neal 的方法使用
font-face
栈,你将不得不依赖你的浏览器来“伪造”粗体和斜体吗?我最近从头开始,制作了一个 html 页面,然后意识到要让这个页面普遍可用,我需要上传多少字体……所以我制作了一个 pdf。也许它对像我这样的业余爱好者来说很有用。
这是一系列字体(无衬线,衬线,人文主义,等宽),每种字体都有几行相同的示例文本,按尺寸递增排列。选择你喜欢的:我正在做的一个网站的列宽为 540px,所以这是使用的行宽。
将其缩放至 900%(不要问!),以便在我的 1920 x 1200 的 Mac 屏幕上准确地呈现 html。
即使缩放无法重现,也可以判断字体的相对大小和强度。
wavehands.net/some text examples.pdf
干杯。
IE11 似乎无法在
font-family
中识别-apple-system
。IE11 认为这是一个无效的值。Ugh。我对 Roboto 太厌倦了。
注意,GitHub - 而且他们还在这样做 - 以某种方式弄错了顺序。他们在堆栈中间使用了通用
sans-serif
族,这会使后面的内容毫无意义。注意,
sans-serif
后面是 emoji/符号字体 - 如果浏览器无法在无衬线字体下显示字符,它将继续尝试这些符号字体。这对 emoji 很有用。你真的想要系统字体吗?我敢肯定大多数人实际上只是喜欢使用像 Segoe 或 SanFranciso 这样的干净无衬线字体。或者你的中国用户真的应该得到 像素化的字体 吗?你的 Ubuntu 用户应该阅读有点古怪的 Ubuntu 字体 吗?不?但那正是他们的系统字体。
也许最好选择一种特定的无衬线字体,例如 Open Sans、Source Sans Pro 或 Monserrat,它适合你的语气并将其嵌入为网络字体。如果你不能或不想这样做,那么你可以使用这个系统字体栈,但最好将 system-ui 和其他不需要的选项排除在外。
还要注意,在不同平台上使用不同字体会导致错误。我收集了一些在我的 博客文章 中 - 所以最好进行广泛的测试。
Windows 7、8 和 10 的字体是什么?
我是唯一一个想知道为什么需要推荐的默认字体的人吗?
这是一篇很棒的文章!我认为添加系统等宽字体栈也会非常有用。
我发现 Chris Coyier 2017 年 6 月 13 日的评论很有趣。所以,为了加载速度和一致性(用户舒适度),“衬线”或“无衬线”目前不够好。在我看来,这需要一个额外的标准。然后,如果特定的操作系统或浏览器无法显示正确的字体,它将在下一个符合标准的版本中简单地修复。这将遵循与我们在 HTML5 网页顶部和字符编码中看到的一样的简化演化路径。
帖子底部的 @font-face 规则在我的 Google Chrome 71 Windows 10 上渲染了 Tahoma
但是系统字体栈有什么意义,为什么不直接使用 “font: sans-serif” 就结束呢?或者,如果你想保持连续性或品牌形象,将一个无衬线字体上传到你的网络空间并使用它。
有一些明确的要点
在 iOS 13 中,系统字体栈设置将显示 Times New Roman。
对我来说,看起来 macos 系统字体在 Chrome 中渲染得太紧凑了,尤其是在较小的尺寸下。字符彼此靠得太近了。是我一个人吗?
我感到困惑的一件事是,Apple 在他们的网站上发布了 San Francisco 字体供下载。在我的设计工具(Sketch app)中,我使用的是SF Pro Text,但这种字体似乎与
-apple-system, BlinkMacSystemFont
不匹配。它们在 macOS 上看起来不同(我尝试过 Chrome 和 Safari)。如果不需要,我不想在我的网站上安装**SF Pro Text**,但这真的很烦人,因为它们不匹配。我想要你在http://www.apple.com上看到的版本。
我是不是漏掉了什么?
这同样让我困惑!我认为 SF Pro 与 SF Display 不同,SF Display 又与 SF UI 不同……后者是系统字体。至少,这是我未经研究的最佳猜测。
看起来“SF Pro Display 用于 20pt 或更大的字体大小,而 SF Pro Text 用于 19pt 或更小的字体大小”。系统字体会在字体大小改变时动态切换这两个字体。
但是,我看到了一个非常奇怪的情况,我从苹果下载的 SF Pro Text 看起来像我在浏览器中看到的 SF Pro Display,而我下载的 SF Pro Display 看起来像我在浏览器中看到的 SF Pro Text。就像它们被互换了。我可以从字母之间的间距看出来。这很奇怪。
嗨,斯图尔特,
我在我的网站上也发现了这个问题,在 Mac 上的 Chrome 和 Safari 中。
你找到解决方案了吗,这样它就可以真正显示 San Francisco 字体了?
等宽版本怎么样?
简单
如果某些字符在第一个字体中不可用,但在第二个字体中可用,情况会怎样?
文本会混合使用这两个字体吗?
是的。
谢谢!我有一个问题。
你的文章没有说明如何在 CSS 中使用系统字体栈中的 Segoe UI 可变字体。你可能知道微软在 Windows 11 中引入了这种字体,但我不知道如何在系统字体栈中使用它,让我的网站在 Windows 11 设备上看起来很棒。请指导。
无需在所有地方重复它们,也不需要使用 @font-face。只需使用 CSS 自定义属性(“CSS 变量”)。
然后在所有地方使用该集合。
在你切换到
system-ui
之前,需要注意一点。https://infinnie.github.io/blog/2017/systemui.html
这不是问题。这是中文默认行为,不应再被视为问题。请查看https://github.com/JLHwung/postcss-font-family-system-ui/issues/210#issuecomment-531519416 和 https://github.com/primer/css/issues/1589#issuecomment-919985344 。
方法 2 不支持font-size-adjust。正确吗?
文章是否需要更新,说明方法 2 现在不再有效?在 macOS 12.5 上,对于给定的示例,我在 Firefox 和 Chrome 中获得 Ubuntu Light,在 Safari 中获得 Tahoma(由于 Safari 禁止使用用户安装的字体来进行反指纹识别)。换句话说,所有这些系统字体名称(以点号开头)都根本没有被识别出来。
现在,如果你只想定位到原生系统字体,那么实际上不需要方法 2,因为
system-ui
现在可以很好地处理这个问题。但是,如果你想专门定位 Apple 设备上的 SF 系统字体,而在其他系统上使用其他字体,看起来你仍然需要使用-apple-system, BlinkMacSystemFont, "Something Else"
。很可惜,Chrome 仍然拒绝识别-apple-system
。很棒的笔记,谢谢!
很棒的文章!赞赏