这是我前几天收到的一个问题?
对于一个复杂的单页应用程序,您建议使用 图标字体 还是 内联 SVG? 两种方式是否存在特定的可访问性问题? 可访问性对我们来说尤为重要,因为学校使用我们的产品。 我之所以问这个问题,是因为我们目前正在统一和建立一个图标系统。
我不认为我会根据网站的“类型”来做出选择,所以让我们忽略这部分内容。
我还认为 SVG 图标系统 比图标字体更好,所以让我们假设是这样的。
可访问性问题是最有趣的部分,所以让我们来谈谈它。
有两种使用图标的方式
- 独立:图标需要独立地传达含义
- 装饰性:图标只是一个视觉上的装饰 – 周围的文字传达了含义。
独立图标模式
我正在根据 Heather Migliorisi 的 可访问的 SVG 进行调整
<!-- role="img" so that the SVG is not traversed by browsers that map the SVG to the "group" role -->
<!-- aria-labelledby pointing to ID's of title and desc because some browsers incorrectly don't use them unless we do -->
<!-- if you are using a <use>-based icon system, this would be a <symbol id="unique-id"> below, but otherwise the same -->
<svg role="img" viewBox="0 0 100 100" aria-labelledby="unique-title-id unique-desc-id">
<!-- title becomes the tooltip as well as what is read to assistive technology -->
<!-- must be the first child! -->
<title id="unique-title-id">Short Title (e.g. Add to Cart)</title>
<!-- longer description if needed -->
<desc id="unique-desc-id">A friendly looking cartoon cart icon with blinking eyes.</desc>
<!-- all the SVG drawing stuff -->
<path d="..." />
</svg>
装饰性图标模式
请记住,装饰性图标的理念是,即使它不存在,也不会有任何影响。 因此,我们将其隐藏在 AT 中
<button>
<svg aria-hidden="true" viewBox="0 0 100 100">
<!-- or <use>, if using a <symbol>-based icon system -->
<path d="..." />
</svg>
Add to Cart
</button>
但是……图标可能以两种方式使用。
没错。 所以您可能应该准备您的图标,使它们能够用作独立的、有意义的图标。 然后,如果它们在装饰性上下文中使用,请在 <svg>
上添加 aria-hidden="true"
。
因此,您的图标系统可能像这样体现…
<Icon icon="icon-cart.svg" standalone="true" />
或者
<?php
$standalone = false;
include("icon-cart.php"); // SVG with PHP logic sprinkled in
?>
或者
<%= render "icon/cart", :locals => {:standalone => true} %>
或者其他任何方式。
假设您必须使用图标字体。
事情就是这样。
许多图标字体的使用方式是这样的
<i data-icon="a"></i>
或者其他变体,比如它使用“私有使用区”作为属性值,或者为每个图标生成唯一的类名,等等
.icon-camera:before {
content: "\e90f";
}
要制作一个独立的图标,这很容易,您只需在元素上添加 aria-hidden="true"
。
如果您需要一个有意义的独立图标,这意味着需要更多 HTML。 来自 防弹图标字体,这是推荐的结构
<span class="icon-fallback-glyph">
<span class="icon icon-hamburger" aria-hidden="true"></span>
<span class="text">Menu</span>
</span>
现在,图标本身被隐藏了(因为它使用了一个奇怪的、没有意义的字体),但存在实际的文本,AT 可以按预期读取它。 您也可以在视觉上隐藏文本。 假设您在此处有一些功能测试,以下 CSS 可以根据需要隐藏/显示
.icon-fallback-text .icon {
display: none;
}
supports-fontface.supports-generatedcontent.icomoon .icon-fallback-text .icon {
display: inline-block;
}
.supports-fontface.supports-generatedcontent.icomoon .icon-fallback-text .text {
clip: rect(0 0 0 0);
overflow: hidden;
position: absolute;
height: 1px;
width: 1px;
}
记住链接图标!
如果图标(以任何这些方式)是链接,请确保其中存在清晰地宣布其功能的普通 HTML 文本,或者提供一个执行此功能的 aria-label
<a href="link" aria-label="See Picked Pens">
<svg>
<use xlink:href="#icon-codepen"></use>
</svg>
</a>
关于您用来视觉上隐藏文本的样式块的一点说明:对于旧版 IE、一些 AT/浏览器组合以及文本换行,有一些小问题,这些样式集合可以解决这些问题
我保留了您的选择器,不过我通常将其作为实用程序类 (
.visually-hidden
),因为它描述了其唯一的目的。有点相关的是,我看到越来越多的网站使用表情符号代替图标。 对于屏幕阅读器用户来说,这是一个问题,Léonie Watson 在她的网站上概述了如何将其降到最低: https://tink.uk/accessible-emoji/
对于老一代(像我一样)的人来说,他们看得见,但无法理解某个特定表情符号要传达的意思,我对其进行了调整,以支持键盘/点击用户: http://adrianroselli.com/2016/12/accessible-emoji-tweaked.html
为什么不使用传统的
alt
标签,避免使用 aria 呢?因为
alt
用于<img>
,而我们在这两种情况下都没有使用<img>
。为 WCAG 2.1 提出
添加识别 CSS 生成的内容图像的技术
将图标字体添加到非文本内容的定义中
使用生成内容时(如前面显示的图标字体示例中所示)还需要考虑的另一件事是,视觉媒体有时需要或受益于提供用于语音输出的替代文本。
除了关注点分离之外,现在可以通过 CSS 直接为生成的内容提供替代文本。 它处于工作草案状态,您可以在 https://www.w3.org/TR/css-content-3/#alt 上了解更多信息
因此,您可以在 CSS 文件中直接增强图标字体的音频输出,而无需编辑 HTML。
例如,由于 alt 属性在使用 VoiceOver 时在 iOS 上受支持,因此我们可以选择静音或在使用图标字体时提供更易读的替代方案。