SVG作为图标字体的替代方案

11

为了完成我的当前工作流,我使用使用Icomoon生成的标志性Web字体。这是一种非常简单和有趣的技术,具有明显的优点:

  • 图标的行为就像任何其他字形一样,因此可以自然地应用任何文本CSS转换,如text-shadowtext-decorationcolor等。
  • 易于重复使用,只需将必要的font-family添加到元素中。

但它也有重大缺陷,让我无法入眠。

  • 无论其曲线对齐到像素网格多么完美,字体图标都会模糊不清。更不用说可怕的Windows渲染了。
  • 很难向字体添加新图标,特别是当源矢量字体不可用甚至丢失时。
  • 它需要一堆不同的字体版本(woff、eot、ttf)才能获得可接受的跨浏览器支持。
  • 最终,字体实际上根本不是用于图形的(特别是不是单色),似乎不是使用虚拟空的非语义<span class="icon"></span>的正确方式。

显然的替代选择是SVG,它没有上述缺点。但是它也有自己的缺陷,这让我不能轻松使用它。

  • 在我们的HTTP / 1.1时代中,许多小文件根本不可接受。
  • 创建图标修改不是一项容易的任务,需要手动编辑,这在我们的just-type-npm-install时代也相当奇怪。

我已经搜索了一些npm软件包,但由于某些原因未能满足我的需求。

因此,我请求您的建议,如何管理这种琐碎和常规的任务。是否存在一种有效且可靠的方法来生成具有原始图标和位图回退的修改版本的SVG精灵?


不知道大多数用户使用的浏览器是什么(当然会有多个浏览器),以及要使用的功能在这些浏览器中的支持情况,谈论“支持旧版浏览器”就没有意义了。我们可以使用方便的 http://caniuse.com 来查看这些浏览器对所需功能的支持情况,它还将显示这些天我们不需要多个来源:一切都支持 WOFF。我们不再需要荒谬的 ttf+otf+eot+woff+svg 集合和“防弹”@font-face 规则来尝试不再加载太多文件 =) - Mike 'Pomax' Kamermans
@Mike 不幸的是,对于我目前的任务,有时支持IE8很重要,但无论如何,它的替代方案并不是紧急问题,主要问题是要使用SVG实现协调。 - Bogdan Slovyagin
哇!真是羞愧,我太习惯那种可笑的防弹技术了。感谢您为WOFF支持打开了我的眼界! - Bogdan Slovyagin
为了更详细地说明,因为评论不支持那么多字符,我写了一篇回复来澄清一些事实,这样你就可以更明智地决定方法和解决方案。 - Mike 'Pomax' Kamermans
我总是更喜欢“SVG 精灵” :) - Guilherme Nascimento
1个回答

14
没有意义谈论“支持旧浏览器”而不知道:
1.你的用户大多数会使用哪种浏览器(当然会有多种浏览器),以及 2.对于这些浏览器,你想要使用的功能的支持情况如何,我们可以使用方便的http://caniuse.com
话虽如此,这并不是一个答案,而是解释所有那些你提出的反对字体的观点都是没有根据的。答案很好,但在这种情况下,我们需要澄清事实,让你能够基于事实做出真正的决策,而不是(过时或者不再有效的)先入为主的观念。我花了太多年时间从工程角度处理字体问题,不能让你维持这些说法=)
“无论曲线多么完美地对齐到像素网格,字体图标都会变得模糊。更不用说可怕的Windows渲染了。”
这根本是不正确的。如果矢量图形呈现不佳,SVG在相同大小下也会呈现不佳,而且通常会呈现更糟:字体实际上允许进行微小轮廓优化以处理小号字体大小(.otf比.ttf更好,在这方面已有字体制作者进行了投入。几乎所有专业字体都经过了这样的处理),而SVG没有,因为它的矢量图形语言中没有指令来执行此操作。因此,字体呈现与SVG相当(如果它们没有优化指令)或比SVG更好(如果有)。
例如,Font-Awesome 带有轮廓优化,可以完美地呈现出14px字体大小,这已经比浏览器在页面上使用的默认字体大小要小(几乎所有浏览器都同意使用16px衬线字体作为默认值)。如果您使用其图标集并将其转换为SVG,然后尝试将其缩小以匹配14px大小,则它们将看起来非常模糊。

或者您可以使用更进一步的图标集,例如Symbol Set,它专门为网格对齐而设计,这意味着即使在比预期尺寸更小的情况下,它仍然能够呈现出非常清晰的效果。

SVG 在这里失利了。

至于 Windows 的渲染,它可能看起来很糟糕,但这并不是 Windows 的错。Uniscribe 和 DirectWrite 都非常擅长渲染字体。就像真的很好(这可能不是一个惊喜,因为桌面出版自从其开始以来一直是微软的核心业务,尽管现在正在转变)。钩入它们的浏览器可以非常好地 渲染字体:IE 甚至自 IE4 开始就支持 Web 字体……那是1997年。那时候 HTML4 还没有成为主流,我们还停留在 HTML3.2。

问题并不是“Windows”,而是“在Windows上使用旧版浏览器的问题”。长期以来,浏览器对Web字体并不关心。仅在最近几年,主要的努力才突然投入到确保它们配备良好的字体成形引擎(例如Harfbuzz,现在被Firefox和Chrome使用),除非您在Windows机器上使用现代版本的“非IE”浏览器,否则您将无法获得漂亮的字体效果。
最后,特定于Windows和IE的“字体与SVG”问题:虽然IE从很久以前就支持Web字体,但SVG支持只在IE9中实现,因此如果您需要支持IE8,则甚至不能使用SVG。对于这个非常特定的目标受众,“字体与SVG”的问题甚至都不存在,您必须选择字体。

“很难向字体中添加新图标,特别是当矢量源字体不可用甚至丢失时。”

不是的,你仍在使用带有CSS的HTML,所以当我们需要“字体不支持的字母”时,我们通常会使用字体回退:font-family: iconfont1, iconfont2, iconetc.

“为了获得可接受的跨浏览器支持,它需要大量不同版本的字体(woff、eot、ttf)。”

现在已经不需要几年了。如今我们不需要多个来源:caniuse向我们展示WOFF已经被所有浏览器支持,并且已经这样做了几个版本。

即使是IE,如果您需要支持IE8,则还必须找到一个.eot(它只是带有额外元数据的ttf文件,以便IE接受它...就像WOFF!),然后必须接受以下事实:如果需要将otf转换为eot,则会得到次优质的字体,因为这是一种损失性转换(就像将.png转换为.jpg。优秀的转换软件可以生成不错的结果,而正常的软件则生成普通的结果)。

因为现在所有的东西都支持WOFF,所以我们(幸运地)不再需要荒谬的ttf+otf+eot+woff+svg全方位字体集合,也不需要“防弹”@font-face规则来优化加载顺序,以便不需要加载太多不必要的文件——只需使用WOFF。搞定了。如果遇到麻烦,可以将.eot作为第一个源(带有格式指示符),除IE外的所有浏览器都会跳过它。
另外,值得注意的是SVG字体支持:几乎没有什么东西支持它,而且那些支持它的东西正在废弃它。SVG字体已经停止使用,因为使用SVG字体的结果比使用真正的字体要糟糕得多,这也强调了第1点的解释。

"最终,字体并不是真的用于图形(尤其不是单色图形),使用虚拟的空的、非语义的<span class="icon"></span>似乎不是正确的方式来实现这个目的。"

这两种说法都是不正确的。
字体用于编码矢量图形,以在排版上下文中使用。这可以是字母、图标、表情符号,甚至可以是音符或麻将牌。它们直到最近的方式一直是“单色”,这就是单色所表示的含义。唯一可能成为字体单色渲染问题的地方是在单色监视器上,在这种情况下:你的网页在哪里被访问,以便它们可以呈现Web字体,但却在古老的甚至连CRT技术都算不上的技术上进行呈现?
至于语义学:如果你需要一个在文档内没有意义且纯粹是UI糖果的图标,则确实需要一个非语义元素,以便对于视觉或阅读障碍的人来说,文本读取器等不会将图标大声读出,并且搜索引擎(私人或公共)的文本索引程序可以完全忽略它们。你的图标应该是一个非语义的空元素,可以被所有东西跳过。 那么位图呢?

位图在小字号下表现出色,但——这可能会让你惊讶——字体实际上可以包含嵌入的位图,以便它们可以在小字号下呈现实际的位图,而不是矢量图形。

当然,只有高级字体才带有这些功能,但这也是你要检查的一件事:你正在寻找的图标字体是否带有位图?如果是,那么我们就赢了。如果没有,那么您可能需要将要使用的图标字体生成为位图文件,然后手动清理位图,再在网站上使用它。

这个过程本质上是手动的,没有工具能够为您完成此操作而不会出错,以至于您仍然需要手动修复问题。但是,如果您按照这条路线,并根据知名字体制作自己的图标,在使图标看起来比字体渲染更好的点大小的基础上:回馈社会,将这些位图发送回字体创建者,以便他们可以使用它们构建字体的EBLC、EBDT和EBSC表,让每个人都可以享受在字体中拥有位图,因此我们不需要进行疯狂的CSS精灵渲染。

我对如此详细的回答印象深刻!嗯,问题本身并不正确,我应该询问我的当前工作流程有什么问题,而不是寻找替代方案。我谈到的第一个问题是渲染质量不可预测,有时可能很好,有时不好。这取决于许多难以控制的因素,如浏览器窗口大小、行高、图标定位的相对单位(%、em、rem等)。我仍然不知道该怎么处理它。 - Bogdan Slovyagin
第二个是多彩图标。当我说单色时,我指的是“只填充一种颜色”。是的,我听说过一些技术,但似乎很难使用、支持和创建新项目。第三个是扩展当前集合。是的,回退方法很聪明,但不适用于快速增长的项目。我相信一定有替代方法,因为 font-family: Iconset, Iconset 2, Iconset3, …, Iconset N 看起来很可疑。 - Bogdan Slovyagin
反驳:回退并不是“聪明”,它实际上是CSS为你设计的。`font-family: FontAwesom, SymbolSet, MathIcons" 是完全可以的,而且快速。字体查找本质上非常高效,因为如果不是这样的话,它们会极大地拖慢页面加载速度。大多数图标文件都是无色的,只有新的OpenType彩色表才带有“表情符号”字体,而对于图标来说,表情符号相对无用(当然,这是个人观点,我讨厌表情符号=)。除非你固定大小,否则字体、SVG、位图在变量下的渲染不可预测。 - Mike 'Pomax' Kamermans
值得尝试几种方法来测试网站,并看哪种感觉正确:有时解决方案不是“找到最佳解决方案然后使用它”,而是“尝试所有选项,看哪一个问题最小”。我会选择字体,因为它们是高度可控的,并且我还会对它们进行子集化处理,这样您只需使用带有图标的微小字体,而不是完整的FontAwesome。 - Mike 'Pomax' Kamermans

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接