Edd Morgan 在文章中写道
显然我们都同意标记应该只包含内容,不包含装饰性元素。但是图标属于哪一类呢?它们不是装饰性的,因此不应该存在于标记中,而应该完全在 CSS 中定义吗?
我相信我们可以想象一个“装饰性”图标。我敢打赌,这是最常见的一种类型。它作为设计的一部分,伴随某个单词或短语。我没有科学论文可以引用,但我认为它们会告诉我们,它可以使某件事更容易记忆、更容易找到、更容易区分或跨文化相关,等等。
这里有一个例子

让我们像 Ed 的问题中的引述那样构建它:“因此不应该存在于标记中,而应该完全在 CSS 中定义”。
<button class="button button-follow">
Follow
</button>
.button-follow {
padding-left: 70px; /* Normal left padding plus space for icon */
background: url(/images/icons/icon-follow.svg) no-repeat left center;
}
HTML 中没有关于图标的任何特定内容。纯粹的装饰性。即使该图像加载失败,或者即使 CSS 加载失败,它仍然是一个按钮,并且它肯定不依赖于任何 JavaScript。如果我们在这里是完美的渐进增强公民,我们将确保<button>
包裹在 <form action="/do/the/right/thing">
中,或者将其设为 <a href="/go/to/right/place">
以确保其功能本身保持完整。
或者我们可以这样做
.button-follow::before {
content: "";
display: inline-block;
vertical-align: middle;
width: 1em;
height: 1em;
background: url(/images/icons/icon-follow.svg);
background-size: cover;
}
HTML 没有变化。
字体图标也是同一种东西
.button::before {
font-family: "icon-font";
}
.button-follow::before {
content: "\e901";
}
尽管即使使用“专用使用区域”,伪元素也会被屏幕阅读器读取,这对于图标来说可能非常尴尬。更不用说 字体图标的其他问题了。
包含在标记中……
如果您追求的是 字体图标的最佳实践,您可能会最终至少得到
<span class="icon icon-hamburger" aria-hidden="true"></span>
如果没有围绕它添加一个包装元素。所以现在我们在 HTML 中有了“装饰性”的东西。您是否应该为此感到难过?不。
我更喜欢 SVG 图标系统,它可能为我们提供更类似于以下的标记
<button class="button button-follow">
<svg class="icon icon-follow" aria-hidden="true">
<use xlink:href="#icon-follow" />
</svg>
Follow
</button>
… 并且该 <use>
可能也引用了 HTML 中某处的 <symbol>
。
我对此感到难过吗?不。
然后还有没有任何支持文本的图标

对于这种情况,我们 可能会这样做
<button aria-label="Save Now" class="button button-save">
<svg class="icon icon-save">
<use xlink:href="#icon-save" />
</svg>
</button>
它略有不同,但总的来说,非常相似。我们没有颠覆世界,因为这个图标是“内容”,而其他图标是“装饰性”的。
它只是 HTML
诀窍在于良好地管理它,而不是教条式地坚持“属于那里”和“不属于那里”的东西。
HTML 充满了各种东西。我的 favicon 在里面,那不是装饰性的吗?我的 Google Analytics 脚本在下面,这根本不像内容。我必须使用额外的 <div>
来给自己一个相对定位的上下文。它没有任何危害。
我更担心 垃圾入侵数据库。
但我明白
拥有某些规则很有帮助。宣扬对 Web 有益而非有害的概念很有帮助。您可能不应该使用 <img>
来完成 background-image
的工作。
我喜欢在使用标记时考虑其含义的想法。它是否完成了您需要它完成的工作?它是否有助于或损害可访问性?性能?可维护性将如何?
我同意。我们不应该仅仅因为“最佳实践”而限制自己,虽然我们应该努力追求最佳实践和 Web 标准,但在某些情况下,界限是模糊的。
background-image
并不总是实用,<img>
也不总是实用,但两者都不一定是坏的。在某些情况下,background-image
实际上过于限制。图标既是内容又是样式,尤其是字体图标包。对于字体/svg 包,请使用包中描述的首选方法,对于基于图像的包,请寻找字体/svg 包。 :)我进来是为了寻找“答案”,我想大多数人都是这样。我想这取决于它在哪里使用;它是否与文本或媒体内容内联(非 CSS 意义上的内联)?如果是,那么它是内容。如果它是 UI 设备的一部分,那么它就不是。这样一来,同一个图标可以在页面中以两种不同的方式使用,一种作为内容,另一种作为 UI 装饰。在我看来,使用相同的方法包含相同的符号来实现这两个不同的目的,仅仅因为这样做更容易,这是一种技巧。也许我是在像 CMS 一样思考……
您对连字图标怎么看?我使用 Material Font Icon 一段时间了,它非常方便。
连字是一种可以将单词转换为图标的字体图标。因此,我可以编写类似
<i>search</i>
的内容来显示放大镜图标。连字很酷……除非您需要多语言(甚至只是非英语)支持 ;) 然后您就会遇到问题。
@Comandeer 但它会污染屏幕阅读器吗?在阅读完这篇文章后,我开始思考,如果我有
<button><i>search</i> Search</button>
,屏幕阅读器会读取“search Search”。对于仅包含图标并使用字体图标的按钮,我认为在可能的情况下,应该在图标旁边添加屏幕阅读器备用文本。只需将其包装在“visuallyhidden”中感觉很好。或者还有什么其他方法?
我同意。
我经常看到在比较表中使用对勾和叉号图标来表示“包含此项”、“不包含此项”。如果没有隐藏文本或 alt 文本,它将完全无法访问,并且对 SEO 也不可见。
任何时候您有非文本内容(如图标),都需要有一个合适的文本替代方案来提供相同或等效的目的。
因此,查看上面的一些示例,“关注”按钮上的图标可以通过 CSS 完成,因为该图像没有向用户提供任何其他信息。它是一个装饰性图像,我可以将其替换为 Lord Helix 的图片,它仍然相关。
但是,在 svg 示例中使用的图标(包括代码对“保存”的使用)最好通过在按钮内的 span 中隐藏一些文本来提供服务
虽然
aria-label
会向一些辅助技术提供正确的信息,但始终最好使用自然的 HTML 语义,并且仅在 HTML 未提供我们所需内容时才使用 aria。否则,我们确实有失败 WCAG 2.0 的 1.1.1 的风险。虽然下一部分是设计决策,但我还会建议在按钮中显示文本。并非每个人都能理解设计中使用的每个图标的含义,因此值得将关键信息(如“立即保存”)实际显示在页面上,供所有人查看。它可能看起来不太漂亮,但对于用户来说会更容易,也更不容易让人感到沮丧。
这里相关的是元素的原始定义
“该标签用于将内联图形(通常是图标或小型图形)合并到 HTML 文档中。”
考虑到这一点,我想说图标是语义内容,应该始终被视为有意义的。
“该元素”指的是 IMG 标签
https://www.w3.org/MarkUp/html3/img.html
恕我直言
我想说,与其他形式的图形相比,“图标”的最初目的是内容,而不是装饰。它的目的是将概念浓缩到一个小的空间中,以帮助用户快速识别。在 Web 页面以外的环境中,图标可能是该信息的唯一表示形式(尽管通常还有更庞大的可选替代方案和回退)。
当然,它们可以用于装饰,但本质上,它们体现了“一张图片胜过千言万语”这句格言。
如果这是你下次更改网站外观(重新品牌化、设计更新等)时想要更改的内容,那么它可能就是装饰性的。如果你有数百个页面,并且整个页面散布着带图标的链接,你就会希望只更改一个链接文件,而不是数百个页面。
我认为图标非常是内容——无论如何都没有抱怨。(按照我第一次阅读问题时的回答。)
一方面我同意David O’Rourke的评论:它们旨在成为独立的、浓缩的内容。
另一方面,我非常不喜欢像我经常看到的那样,直接在标记中包含图标。我更喜欢使用类来触发图标的出现,并将图标的插入留给CSS。
不:
<p><i class="my-icon"></i>需要图标的文本 </p>
是:
<p class="my-icon"> 需要图标的文本 </p>