就目前而言,使用图标字体的最佳标记是什么?让我们介绍一些我认为目前最佳的选择。
- 您希望图标增强某个单词
- 您希望图标独立存在,但仍然具有功能性或信息性
我们的主要目标是
- 获得尽可能好的语义
- 尽可能减少屏幕阅读器的尴尬
这方面的问题之前 曾经 被讨论过 多次,但我认为以下技术向前迈进了一小步。
增强单词
假设我们有一个像“统计”这样的标题,我们希望将其与页面上的其他标题区分开来并强调其含义。语义理想
<h2 id="stats" class="stats-title">Stats</h2>
结果

因此,要将该图标插入其中(请记住,我们在这里讨论的是字体图标,我们不能只是填充左侧并使用背景),我们需要插入一些内容。
使用伪元素很诱人,因为 1)大多数屏幕阅读器不会读取它们 2)我们不需要为图标分配专门的标记,这是一个语义理想。不幸的是,OS X 上的 VoiceOver确实会读取伪元素的内容。(参考 1,参考 2)好吧,也许是“幸运地”,如果我正确地阅读了规范,这就是它应该做的事情。伪元素不在 DOM 中,因此这可能使第三方应用程序更难以处理。
好消息是,如果我们使用一些标记,我们可以使用aria-hidden属性阻止其被朗读。
还有一个坏消息,即使在围绕图标的标记上使用了aria-hidden
,OS X 上的 VoiceOver 也会在聚焦时宣布“HTML 内容”。#该死。
但幸运的是!我们仍然可以在这里获胜。如果我们结合使用标记技术和伪元素技术,我们可以插入图标而不会出现 VoiceOver 的奇怪现象。作为双赢的免费赠品,这种组合技术非常适合保持我们的 CSS 简洁高效,因为它不需要类名膨胀,并且可以很好地用于我们需要介绍的下一个用例。
因此,最终的标记变为
<h2 id="stats">
<span aria-hidden="true" data-icon="⇝"></span>
Stats
</h2>
CSS 为
[data-icon]:before {
font-family: icons; /* BYO icon font, mapped smartly */
content: attr(data-icon);
speak: none; /* Not to be trusted, but hey. */
}
太简单了吧?请注意,我们没有为图标使用特定的类名(例如 .icon-stats 或类似的东西),而是使用data-*
属性来保存我们要插入的确切字符。在我们的图标字体中,我们将这些特殊字符映射到我们想要使用的图标。我发现这完全是语义化的,甚至具有前瞻性(即使您更改了字符,您也可以随时在以后唯一地进行选择)。但是,如果您更喜欢类名,那也很好,这不会大幅改变此技术。
我们将在最后介绍字符映射。
独立图标
假设我们有一个图标是链接或以某种方式起作用,但它没有伴随任何文本。例如,您可以点击进入购物车的一个购物车图标。希望该功能在视觉上是显而易见的,具有一些悬停状态或一般的设计明显性。但该功能也需要在听觉上是明显的。
与其为此创建一个全新的技术(我过去曾尝试过),不如依靠我们已经开始使用的技术。一个插入字符并使用伪元素的 span,以及紧挨着它的文本,我们在视觉上将其从页面上踢开。
<a href="#rss" class="icon-alone">
<span aria-hidden="true" data-icon="▨"></span>
<span class="screen-reader-text">RSS</span>
</a>
我们只需要很少的额外 CSS,只需通过类应用一些可用性修复,以及一个用于隐藏文本但保留其可访问性的工具箱类。
.icon-alone {
display: inline-block; /* Fix for clickability issue in WebKit */
}
.screen-reader-text { /* Reusable, toolbox kind of class */
position: absolute;
top: -9999px;
left: -9999px;
}
嘿,它有效
2012 年 10 月更新:我创建了一个更合适的演示,比较了使用不同技术的图标字体用法。
无论如何,在 VoiceOver 中。很高兴听到使用其他屏幕阅读器的人们如何评价这一点。
构建/映射您的图标字体
目前,图标字体世界中一个“问题”是,大多数可用的图标字体都预先映射到字母。如果使用不正确的标记,这些字母会变成“内容”并成为文档语义的一部分。或者更糟糕的是,被屏幕阅读器大声朗读。
图标几乎从不应映射到字母。相反,我建议将图标映射到您可以找到的最接近的 Unicode 符号。例如,将心形图标映射到❤是一个绝妙的主意。无论如何,符号的含义都是相对的,因此接近就足够了,并且会立即成为语义改进。
更好的是,我喜欢将图标映射到 Unicode 的“专用区域”的想法。据我了解,这正是它存在的原因,用于您自己的特殊字符。以这种方式映射,您不会有任何危险,屏幕阅读器不会朗读该字符。不幸的是,在撰写本文时,以这种方式映射的图标在最新的 Safari 中甚至都不起作用,因此尚不建议使用。 以下是 Keyamoon 对专用区域问题的概述:
PUA(专用区域)和 SPUA(补充专用区域)之间存在差异。区别在这里 解释了一点。在我的测试中,PUA 映射在所有浏览器中都能完美运行。仅在 Windows 上的 Safari 中,SPUA 映射才会出现错误。IcoMoon 应用程序仅映射到 PUA,至少在短期内是推荐的。
以下是需要遵循的步骤
您还可以使用Pictos Server进行图标选择和映射,但它仅适用于 Pictos,并且无法帮助您选择符号(您可以从此处复制和粘贴)。不过,它是一个非常不错的集合,可以为您托管并简化对现有集合的操作,而无需手动更换字体文件。
未来
将来,希望我们可以依靠speak: none;
在任何地方都能完美工作,以便我们可以重新使用伪元素和完美的语义。
相关
- 如果您担心 Firefox 3.5/3.6 和 IE 6-9 中与 @font-face 相关的 FOUT(未设置样式文本闪烁),一种解决方案是尝试使用FOUT-B-Gone。
- 图标字体综述
嘿,Chris,感谢您提供这篇精彩的阅读。
我喜欢您的语义,但始终不明白您为什么如此关心屏幕阅读器。您是否有关于屏幕阅读器流量的任何统计数据?
我不得不说,这是因为您不想出于任何原因排除任何人。这与我们现在都必须制作面向移动设备的、面向未来的响应式网站的原因相同。因此,虽然您的 WordPress 网站现在可能只有 1% 的移动访客,但这会增加。以至于在不远的将来,有些人可能永远不会拥有台式电脑,并且他们的整个在线体验都将通过移动设备进行……
哦,是的,解决问题很有趣。
在这种情况下,显而易见/常见的解决方案“不起作用”这一事实表明解决方案本身存在缺陷:正如 Chris 所指出的,这种方法实际上不起作用(屏幕阅读器识别正确了:只是结果并非我们想要/期望的)。
即使他们不关心屏幕阅读器(当然,我们应该关心屏幕阅读器),我也能理解为什么这会困扰某些人。
每个人都能访问的网络应该是每个人的目标 #imho
政府网站啊…
大多数都需要某种 508 合规性,因此即使它们从未从屏幕阅读器获得大量流量,也需要符合可访问性标准。
屏幕阅读器是用户与我们网站上的内容交互的另一种方式。除了明显的可访问性影响之外,我们还应该编写代码以满足所有人的需求,无论他们如何访问(键盘、移动设备等)。
有趣的是,您为屏幕阅读器优化所做的事情在大多数情况下也是通用的最佳实践。
他关注屏幕阅读器是因为政府或公共资助机构(如学院或博物馆)的任何网站都必须具有可访问的网站。在加拿大,政府也要求私营企业使其网站可访问。这很可能很快就会成为法律。所以,为什么要构建一个网站,然后又要重新构建一个可访问的网站?为什么不在一开始就以这种方式设计呢?
很棒的主题,我一直想使用字体图标。您只需使用 CSS3 就可以实现很多动画。
我也遇到过同样的情况。在 CSS 可以处理字体嵌入等之前,我曾将它们与图像生成工具一起使用过。
我列出了迄今为止我最喜欢的几个。如果有人知道更多,请告诉我。http://www.bentdesignstudio.com/v2/2012/05/icon-fonts/
服务本身看起来非常熟悉。请参阅开源 http://fontello.com/
仅供记录,我必须说,我的工具的旧版本甚至在 pictos 服务器之前就已经可用。它是第一个允许构建自定义字体图标的工具。您可以查看我网站上的更改日志页面。
已收藏 :)
并且 fontello 生成的字体有提示。这对于小尺寸可能很重要。
似乎 Icomoon 字体至少针对 16 和 32 像素大小进行了提示……查看文本对齐和页面类型图标以获取最清晰的示例。
很棒的文章,Chris!
很棒的文章。
我在我的网站上尝试了 Icomoon 的 PUA 技术。
它在以下方面运行良好
– 所有 PC 上的 IE
– PC 和 Mac 上的 Chrome
– PC 和 Mac 上的 Firefox
– Mac 上的 Safari 5.1.2
– 移动 Chrome(Android)和移动 Safari(iOS)
它在以下方面不起作用
– PC 上的 Safari 5.1.2
– 所有平台上的 Opera
您是否在 WebKit nightly 版本中尝试过?也许它将在 PC 上的 Safari 5.2 中得到支持。
“此外,我相信 Safari 最终会支持 PUA,我们也可以完美地以语义方式映射图标。”
希望它能尽快实现。很棒的帖子。=)
Chris,我非常喜欢这篇文章,但我认为使用类名的优缺点更倾向于使用类。
data-icon="⇝" - 对我来说看起来很笨拙
而 class="stats" - 更有意义
<span aria-hidden="true" data-icon="⇝"></span>
变成
<span aria-hidden="true" class="icon stats"></span>
以及
[data-icon]:before {
font-family: icons; /* 自带图标字体,智能映射 */
content: attr(data-icon);
speak: none; /* 不可信,但就这样吧。 */
}
变成
.icon:before {
font-family: icons; /* 自带图标字体,智能映射 */
speak: none; /* 不可信,但就这样吧。 */
}
.stat {
content: ⇝;
}
/* 此处列出其他类 */
我意识到 CSS 会稍微多一点,但这很可能只在 CSS 中创建一次,并在整个网站/应用程序中无数次地实现。
#IMHO
我同意 Tom 的观点,当通过 HTML 阅读时,能够通过类来识别字体是什么要容易得多,而不是使用模糊的 Unicode 字符,此外,它使重用更简洁,因为我不必参考我的 Unicode 映射。
我还没有尝试过。但我只想补充一点,我当然更喜欢能够在样式表中定义内容,而不是在 HTML 中定义。由于我的 CSS 文件始终是外部文件,因此这允许我管理和修改图标信息,而无需触碰 HTML 页面。例如,如果菜单中有一个图标,那么我需要更改每个 HTML 页面(data-icon=),而不是只更改 CSS 文件。
非常感谢!
我必须澄清一些关于 Safari 不支持 PUA 的混淆。PUA 和 SPUA 之间存在差异。请参阅此维基百科页面:http://en.wikipedia.org/wiki/Private_Use_(Unicode)#Private_Use_Areas
PUA 完全没有问题。但是,如果您使用SPUA,它将无法在 Windows 版本的 Safari 中运行。
谢谢 Keyamoon,您的字体生成器在所有浏览器和所有平台上都能使用 PUA 编码正常运行。
真是天时地利人和!我正在为一个项目定义前端图标使用标准,这篇文章帮助很大!
IcoMoon 的默认 CSS 建议使用
[class^="icon-"], [class*=" icon-"]
选择器,这让人担心浏览器性能。但[data-icon]
选择器似乎运行良好(增加了 60 毫秒)。不错,伙计!
生成的 CSS 包含这两种技术 :)
如果您想邀请 ie7 参加派对,您可以将字符代码直接放在标签中,例如:<i class=”ico”>& #xe826;</i>
很棒的文章,确实让我在未来的网站上有了新的思考方向。感谢您的辛勤工作。
我认为使用<b>元素而不是<span>元素插入图标是一个更好的主意。<b>元素表示某些内容应该在样式上有所偏移,而图标就是。
<i>现在也成为了一种样式元素,而不是用于添加<em>强调的元素,并且图标以字母<i>开头,我喜欢将其视为伪语义,并且经常用它来编写图标。此外,它比<span>写起来更短。
这个 speak:none; 属性听起来非常棒。希望我们有一天可以依赖它。
一开始我不确定我对使用数据属性(如 Tim)抽象类有什么感觉,但越思考 CSS 参数化,我就越喜欢它!
我使用一个大型应用程序,该应用程序使用了数十个图标;维护可能很麻烦,对于不熟悉 CSS 的任何人来说,实现起来也更难。此解决方案将解决这两个问题 - 样式表简洁、可扩展且可访问。
很棒的文章,感谢您将其整理出来!
您是否考虑过联系可访问性专家?一年前,巴尔的摩刷新活动邀请 Reinhard Stebner 做了一场关于他作为盲人使用网络的体验的演讲。他的演讲非常吸引人,并且他提供了改进网络的服务。
这是其他与会者想法的总结 -
http://bfreemore.blogspot.com/2011/01/web-accessibility-with-reinhard-stebner.html
您也可以为此目的使用 ENTYPO 字体。
为什么屏幕阅读器会读取生成的內容呢?他们的工作不应该是读取页面的內容(标记)吗?在我看来,生成的內容首先不应该用于实际的页面內容 - CSS 用于表现,而不是內容。我错误地认为屏幕阅读器做错了,而不是开发者吗?
我一直在使用aria-label 来标记我的图标字体。除了 Webkit 之外,我还没有在任何其他地方进行过测试,但它似乎在没有额外的 span 的情况下也能读取相同的内容。
这是一个示例.
Shazbot。我习惯于说无论是什么,“只在 Webkit 中有效”。我的意思是,我仅在 VoiceOver 上对其进行了测试。
Chris,
这是一篇很棒的文章,我刚刚用它为客户创建了一些很棒的按钮。能够缩放、调整颜色以及控制图标的其他方面非常强大。我之前一直不愿尝试这样做,因为我不想牺牲可访问性,但现在,在你的帮助下,我不必担心了。
我的客户很喜欢图标在悬停时稍微移动一点 - 我为此使用了一个简单快速的过渡。正是这些小细节让网站更加引人入胜。
再次感谢!
另外,感谢评论者和社区 - 你们的想法和见解也深受赞赏。
很棒的字体工具链接 :)
我们不是决定 -9999px 是个坏主意,因为浏览器必须渲染一个 10000px+ 的容器吗?
指的是这个
.screen-reader-text { /* 可重用,工具箱类的 */
position: absolute;
top: -9999px;
left: -9999px;
}
似乎可以用这个来代替
.hide-text {
text-indent: 100%;
white-space: nowrap;
overflow: hidden;
}
http://www.zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement/
对于 Compass 用户,这里也有一些有用的东西
http://compass-style.org/reference/compass/typography/text/replacement/
如果你坚持使用精灵图
http://compass-style.org/reference/compass/utilities/sprites/sprite_img/#mixin-sprite-replace-text-with-dimensions
我使用 H5BP 的 visuallyhidden 类
很棒的文章,我正在我正在开发的网站上使用 Ico Moon 应用。我无法用合适的图标替换搜索表单上的按钮,因为我无法在其中嵌套 span。有没有办法解决这个问题,而不用将东西叠加在一起?
坦率地说,我非常不喜欢图标字体。它们完全没有语义。更重要的是,尝试在浏览器中禁用 Web 字体,然后查看使用此类字体的网站。将显示字母或其他完全无关的字符,而不是这些图标。当由于某种原因未下载图标字体(服务器问题等)时,也会发生这种情况。
这整篇文章都是专门针对这些问题,并解释为什么如果你做对了,你刚才说的那些事情都不是真的。
@Chris
我必须承认,我可能使用了错误的词语来描述这个问题。代码可能是语义化的,但我认为在可访问性方面至少存在几个问题。
这篇文章更好地描述了我想要表达的意思
图标字体可访问性
以及这个
这篇文章来自 2011 年,但这些问题仍然相关。如果你关闭 Web 字体(如果你打开受保护模式,IE9+ 会禁用它们!)或覆盖浏览器中的默认字体,则会显示一堆随机字母/数字而不是图标。这正是 CSS-Tricks 和许多其他网站上发生的情况。
首先,抱歉我是法国人,所以我将尝试写好…
我正在研究字体图标的可访问性,因此我在这里看到了很多关于你技术的示例。但是,你在 HTML 中添加了“aria-hidden”和“data-icon”属性的标记,而我不想为了显示图标而插入标记。因此,我们能否简化你的技术,只需在“图标标记”中添加“data-icon”属性,并确保屏幕阅读器不会“看到”它?例如
Filament group 进行的测试表明,图标字体与几个浏览器存在一些兼容性问题。你在测试中遇到过这些问题吗?作为参考,这是他们整理的兼容性图表,可以与他们的 Grunticon 解决方案进行比较:https://docs.google.com/spreadsheet/ccc?key=0Ag5_yGvxpINRdHFYeUJPNnZMWUZKR2ItMEpRTXZPdUE#gid=0
我在查看某个网站的源代码时偶然发现了这个图标字体的东西。所以我做了一些搜索来了解更多关于它们的信息,即使在阅读了这篇文章之后,我仍然不太了解这个图标字体的东西。
无论如何,我将要玩弄图标字体,阅读不如亲自动手实践这些新事物 :)
谢谢,
Shyam Chathuranga。
出于好奇,为什么在独立图标解决方案中只有 -9999px 图片替换解决方案有效?我尝试了这里列出的两个最新添加这里:Scott Kellum 方法(文本仍然显示)以及 H5BP 方法(文本变为不可见,但仍然占据其位置),但两者都不起作用。:/ 如果尝试避免 -9999px 解决方案,可以修复吗?
嘿,有个错别字:“psuedo” 应为“pseudo”。;)
谢谢。已修复并隐藏。