Facebook的HTML和Twitter的Bootstrap HTML (v3之前)都使用<i>标记来显示图标。
然而,从HTML5规范来看:
元素I表示一段文本的交替语音或语气,
或者以其他方式偏离正常的散文,比如分类学
名称,一个技术术语,来自另一个人的惯用短语
语言,一种思想,一艘船的名字,或其他一些散文的典型
字体显示是斜体的。
为什么他们使用<i>标签来显示图标?这不是不好的做法吗?还是我漏了什么?
我使用span来显示图标,它似乎为我工作到现在为止。
更新:
Bootstrap 3为图标使用span。官方文档。
引导5回到i正式文档
我的猜测:因为Twitter看到了支持旧浏览器的需要,否则他们将使用:before /:after伪元素。
传统浏览器不支持我提到的那些伪元素,所以它们需要为图标使用一个真正的HTML元素,由于图标没有“exclusive”标记,它们只是使用了< I >标记,而且所有浏览器都支持该标记。
他们当然可以使用<span>,就像你一样(这完全没问题),但可能是因为我上面提到的原因加上Quentin提到的原因,这也是Bootstrap使用< I >标签的原因。
当你出于样式原因而使用额外的标记时,这是一种糟糕的做法,这就是为什么发明了伪元素,将内容与样式分开…但是当您看到支持旧浏览器的需求时,有时您不得不做这些事情。
PS.事实上,图标以“i”开头,并且有一个<i>标签,这完全是巧合。
Quentin的回答明确指出i标签不应该被用来定义图标。
但是,Holly认为span本身没有任何意义,并投票支持i而不是span标签。
很少有人建议使用img,因为它的语义和包含alt标签。但是,我们也不应该使用img,因为即使是空src也会向服务器发送请求。在这里阅读
我认为正确的方法是,
<span class=“icon-fb” role=“img” aria-label=“facebook”></span>
这解决了span中没有alt标签的问题,并使视力受损的用户可以访问它。它是语义的,没有滥用(黑客)任何标签。
在这里,我对其他人的回答采取了完全不同的方法。让我在解决方案的开头说明一下,有时标准和约定就是要被打破的,特别是在标准HTML词法标记定义的上下文中。
没有什么可以阻止您创建自定义元素,这些元素是自描述的。
现代浏览器甚至IE 6+ (w/ shim)都可以支持以下内容:
<icon class="plus">
or
<icon-add>
只需要确保标签规范化:
icon { display:block; margin:0; padding:0; border:0; ... }
如果你需要支持IE9或更早版本(见下文),请使用垫片。
看看这篇StackOverflow帖子:
有办法在HTML5中创建自己的html标签吗
为了进一步说明我的观点,谷歌的Angular指令和新的Polymer项目都利用了自定义HTML标记的概念。