内联 SVG 与图标字体 [CAGEMATCH]

Avatar of Chris Coyier
Chris Coyier 发布

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 $200 免费积分!

如果您正在为网站构建图标系统,您有一些选择。如果您知道图标需要是栅格图像,那么您可能会使用 CSS 精灵。如果图标将是矢量图像(如今更为常见),您有一些选择。其中两个选项是 使用内联 SVG使用图标字体

让我们比较一下。

图标是矢量

矢量图标有很大的优势:可以随意放大缩小而不会损失质量,在视网膜显示屏上格外清晰,而且文件体积小。

图标字体 内联 SVG
浏览器将其视为文本,因此图标会以这种方式进行抗锯齿。可能导致图标不像您期望的那样清晰。 直接矢量

在我最近的一个个人例子中,当我将一些图标从字体转换为 CodePen 上的 SVG 时,一些字体图标明显不如我转换的图标清晰。

CSS 控制

图标字体 内联 SVG
您可以通过 CSS 控制大小(通过 font-size)、color、阴影、旋转等。 您拥有与字体相同的 CSS 控制,但更强大,因为您可以 1) 控制多部分图标的各个部分,以及 2) 使用 SVG 特定的 CSS,如描边属性。

内联 SVG 的最大优势可能是多色图标。

定位

图标字体 内联 SVG
定位字体图标可能会很麻烦。图标是通过伪元素插入的,它取决于 line-heightvertical-alignletter-spacingword-spacing、字体字形的設計方式(它是否自然地具有周围的空间?它是否具有字距信息?)。然后伪元素 display 类型影响这些属性是否起作用。 SVG 的大小就是它的大小。
请查看伪元素框如何不完全位于字形实际所在的位置。
SVG 框的大小就是 SVG 的大小。

奇怪的故障

图标字体 内联 SVG

图标字体可能会出现故障,因为 1) 它在没有正确 CORS 标头的跨域加载,而 Firefox 不喜欢这种情况 2) 由于任何原因,字体文件加载失败(网络故障、服务器故障等) 3) 存在一些 奇怪的 Chrome 错误,它会删除 @font-face 并显示回退字体 4) 令人惊讶的浏览器 不支持 @font-face。

字体故障由于各种原因非常常见。此外,如果您尝试执行一些巧妙的操作,例如将图标映射到 Unicode 的“专用区域”,而字体出现故障,它可能会发生一些非常奇怪的事情,例如显示意外的表情符号,因为您所在的環境使用相同的区域来表示表情符号。或者,该表情符号甚至可能覆盖您的字形!

内联 SVG 位于文档中。如果浏览器支持它,它就会显示它。

强制故障

图标字体 内联 SVG
  • Opera Mini 或 UC Browser 等代理浏览器根本不支持 @font-face,即使它们有时会报告支持。因此,即使您尝试进行特征检测,它也可能失败。
  • 有些人强制使用自己的字体来覆盖您的字体,例如在用户样式表或专门用于应用自定义样式的浏览器扩展中。例如,一种用于应用字体的扩展,更适合患有阅读障碍的人。(有关 图标字体可访问性的问题 的更多信息,请参见 Seren D 的内容。)
  • 阻止技术可以自动或选择性地阻止自定义字体。(参考
即使那些代理浏览器也支持 SVG。阻止程序不关心 SVG。
广告拦截器提供完全阻止自定义字体的功能。
强制在页面上使用不同的字体可能会破坏图标字体系统。

语义

图标字体 内联 SVG
为了负责任地使用,您正在通过 在(空)<span> 上的伪元素 注入图标。这不好或没有语义,取决于您对这种事情的看法。 图标是小图像。<svg> 的语义是“我是一张图像”。在我看来,这似乎更好。

可访问性

图标字体 内联 SVG
在使用图标字体时,您必须非常小心,以确保以可访问的方式进行操作。您基本上应该按照 这篇文章 中的方法操作。您始终在努力确保图标本身不会被读出(而是其他内容被读出),以及处理难以检测到的故障状态。 我不是专家,但是 研究 表明,使用适当的元素和属性组合(<title><desc>aria-labelledby),您可以在各种浏览器中传递良好的信息。此外,没有奇怪的故障状态。

易用性

图标字体 内联 SVG
使用预先创建的图标字体从来都不是特别负责任的(太多未使用的图标)。创建自己的图标字体从来都不是很舒服。我认为最好的工具是 Pictos Server(仅限于 Pictos 图标)和 IcoMoon(免费登录以保存项目)。Fontello 具有 API,但我没有看到它用于构建良好的工具。 内联 SVG 系统更简单,因为您可以在需要时手动完成所有操作。或者使用 IcoMoon 等工具(以两种方式导出)。或者使用 构建工具

浏览器支持

图标字体 内联 SVG
非常深入。甚至 IE 6。 相当不错,但问题是 IE 8 及更早版本和 Android 2.3 及更早版本。回退可行,但并不理想。

获胜者

一切都取决于浏览器支持。如果您能够使用 IE 9+ / Android 3+,那么内联 SVG 在几乎所有方面都比图标字体更好。如果您需要更深入的浏览器支持,我觉得内联 SVG 回退会太麻烦,不值得(维护 PNG 副本,插入额外的元素以显示 PNG 版本,隐藏 SVG 元素……这很麻烦)。