图标。 它们很流行。 它们有助于补充内容(大多数时候)。 但它们有时也会令人头疼。
一旦您确定了格式(SVG 或图标字体?)并设计了集合,仍需考虑其他因素,其中许多因素会在编码过程中出现。
以下是一个经常出现的优秀问题
@chriscoyier #smashingconf 有任何关于如何将 #svg 图标与文字对齐的建议吗?
— Andreas Sahle (@pixelmord) 2015 年 10 月 20 日
棘手吧? 对齐图标可能是一项艰巨的任务,尤其是在 您不是负责设计图标的人 的情况下。 我必须坦诚地说,我以为这将是一个简单的问题,可以在一条推文中解决。 但是,在图标和文字之间找到完美的对齐方式,远不止此。
值得庆幸的是,我们可以使用一些通用技巧来确保我们的图标始终与文字完美对齐。
技巧 1:确定图标格式并坚持使用
我理所当然地认为,除了 SVG 之外,还有其他方法可以创建图标。 实际上,有很多方法,如果您包括那些可能被认为过时的,例如,“那可是 2011 年的东西!” 一些例子
无论您喜欢什么(咳咳,SVG,咳咳!),图标的格式与您将它们与文字对齐的方式有很大关系。 假设所有图标都包含在精灵中。 这意味着图标基本上以固定尺寸设置(除非您从大尺寸开始并使用 background-size
缩小),调整内容的大小和 line-height
以匹配图标会容易得多。
SVG 之类的东西的美妙之处在于,它本质上是可伸缩的,并且让您能够更多地依靠 CSS 来帮助对齐事物,而不是依靠设计过程。
这里的教训是:为所有图标选择一种格式,并以此为基础来处理将它们与文字对齐的方式。 您的代码将更易于维护,您的设计师(或您内心的设计师)会感谢您。
技巧 2:使用大小相似的图标
这是一个理想的情况:所有图标的大小完全相同。 假设集合中的所有图标都是 100px
正方形。 这告诉我们我们正在处理的空间大小,并且使对齐变得轻而易举。
我们也知道,这并不总是实际的规则。 图标所占用的空间可能会因我们传递的信息而异。

地图图标比头像图标窄,头像图标比购物车图标窄。 如果您像我一样,您将消除图标周围的空白,以确保文件大小尽可能小。 这很好,但现在我们有了不同尺寸的图标。 如果我们使用 SVG,那么这就可以了,但对于非矢量格式(如 PNG)来说就不那么理想了。 我们可以告诉 SVG 占用固定的空间而不会损失分辨率,但是如果我们使用不一致的尺寸,则非矢量格式会拉伸和扭曲图像。
这里正确的做法是将图标设计规格与正在使用的格式匹配。 如果使用 SVG,则图标可以是任何大小,但尝试在 Illustrator(或您选择的其他设计工具)中使用一致的尺寸画板。 这将有助于使集合中将来的图标保持比例。
如果使用非矢量格式,则始终使用相同的尺寸。 图标在所占空间方面可能有所不同,但这将确保图标始终清晰且按比例显示,无论旁边是什么文本。
技巧 3:将字体大小与图标集的大小相匹配
图标应该像版式一样被对待。 它们要么与文字一起使用,要么替代文字,因此将图标的大小设置为与旁边文字的大小相同的原因与我们喜欢大小一致的字母的原因相同:可读性。
这并不意味着如果您的内容字体大小也是 16px,则图标也必须是 16px。 这意味着要意识到字体大小,并确保您的图标与之很好地互补,无论它比文字大、相同大小还是比文字小。
以下是对齐良好的图标与未对齐良好的图标之间的差异示例。
查看 CodePen 上 CSS-Tricks 的 MyxBrQ。
左侧的示例与内容字体大小更加一致,并且比右侧对齐得更好,尽管两个示例在技术上都已对齐。
技巧 4:使用 CSS 微调外观
归根结底,有一个简单有效的秘诀可以将图标精确地放在您想要与文字对齐的位置
.icon {
position: relative;
/* Adjust these values accordingly */
top: 5px;
left: 5px;
}
这就是图标看起来与文字完美对齐与图标看起来略微偏离之间的区别。
查看 CodePen 上 CSS-Tricks 的 YqBdxx。
技巧 5:为特定图标使用类名
上面的示例很棒,但您可能已经注意到,位置图标看起来太窄了,而且甚至比音乐符号更远离文本标签。 多么令人恼火!
这就是每个图标的 CSS 可以帮助我们摆脱困境的地方。
<ul>
<li><svg class="icon-user"><use xlink:href="#icon-user"></use></svg> Weezer</li>
<li><svg class="icon-location"><use xlink:href="#icon-location"></use></svg> Santa Monica</li>
<li><svg class="icon-music"><use xlink:href="#icon-music"></use></svg> Discography</li>
<li><svg class="icon-sphere"><use xlink:href="#icon-sphere"></use></svg> weezer.com</li>
<li><svg class="icon-cart"><use xlink:href="#icon-cart"></use></svg> Artist Store</li>
</ul>
/* Match any class name that starts with icon */
[class^="icon"] {
width: 50px;
height: 50px;
position: relative;
top: 15px;
margin-right: 10px;
fill: #fff;
}
/* Reposition the music note icon */
.icon-music {
right: 5px;
}
呼,好多了!
查看 CodePen 上 CSS-Tricks 的 QNoBVq。
总结
如果您发现对齐图标与文字比您预期的要复杂得多,那么您并不孤单。 简单来说,这实际上取决于您选择创建图标的方法。 从那里,CSS 就很简单了。
这个问题的答案只涉及文字,但还有其他元素涉及图标对齐,例如按钮、表单字段、导航,以及其他许多东西。 我的意思是,响应式设计呢?! 无论是哪种情况,我发现这里介绍的五个技巧都能帮助我摆脱困境。
我使用自己的自定义字体图标,到目前为止,我发现最好的技巧是将所有图标设计为相同的画布大小,但导出时,如果有些图标比其他图标窄,则只导出图标,而不是整个画布。
这确保了两件事,它避免了不必要的填充,并使图标左侧和右侧的填充保持一致。
Dave Gandy 在 Medium 上发表了一些关于此问题的精彩文章。
嗯…… 使用 svg,您可以基本将它们显示为内联块,然后正确对齐。 我更喜欢使用基线对齐。 此外,您可以直接使它们的大小与当前字体大小的上下文相匹配,因此:width: 1em 和 height: 1em。
您可能需要调整某些特定图标的位置——为此,您可以将垂直对齐设置为类似 -0.2em 的值——您可以使用它来相对于基线调整图标位置,这也会随字体大小进行缩放
我使用这种方法,虽然我没有进行任何研究或任何其他操作——
vertical-align: -0.Xem
似乎是最干净的方法,直接想到的。我最近一直在混合使用旧方法和新方法,用 SVG 制作精灵图。以下是我使用这种技术的原因。
如今,更简单的图标模型是使用字体。例如,我们可以使用像 FontAwsome 这样的通用字体。这种方法在很多情况下都能满足需求。但是,它也有一些缺点,比如在 S.O. 中出现锯齿,如果使用更改浏览器字体的扩展程序,可能会导致字体来源不同,此外它只能使用一种颜色。
带有精灵图的 PNG 格式仍然被像 Google、YouTube、Facebook 和 Instagram 这样的知名网站使用。很多人告诉我,这样做是为了覆盖尽可能多的用户。我也看到了这种方法的一致性优势。除了被所有浏览器支持外,PNG 格式的图标在所有浏览器中都会以清晰的方式呈现,即使使用默认设置也是如此。这种方法也有一些缺点,比如视网膜屏幕和浏览器缩放。
在线 SVG 非常棒,但我发现有两个让我困扰的问题:一是代码冗余。一个复杂的图标可能包含数百行相当混乱的代码。这是我们为了通过 CSS 编辑元素而付出的代价。另一个缺点是,当我发现有些用户出于某些原因不使用默认网站 CSS,或者禁用了一些功能(比如残疾人或网速较慢的用户),图标在屏幕上会变得很大,让人很不舒服。
在 90% 的情况下,图标会伴随着一个描述。这个例子构建得非常好,所以我也赞成直接在 HTML 中使用元素。例如,在下面的例子中,我们可以使用图标隐藏一段文本,即使这样它也能被屏幕阅读器识别。
用户 </ icon> Weezer
但大多数情况下,我们看到的是:
浏览器图标 </ icon> 谷歌 Chrome 浏览器是最快的
在第二个例子中,我认为存在冗余信息。在这种情况下,如果图标只是为了网站的美观,我建议使用 background-image。
</ div> 谷歌 Chrome 浏览器是最快的
通过添加一个 div 元素,我们可以使用 CSS 完美地处理它,而不会影响内容本身。由于这些原因,我采用了 SVG 精灵图的方法,它具有相对的大小,而且在某些情况下,即使 CSS 图标被禁用,它也能正常显示。像所有方法一样,它也有一些缺点,比如在一些特定效果的情况下需要复制图像。
我通常使用带有 background-image 的图标,这种方法有什么问题吗?我觉得它让定位变得更容易,而且需要的 CSS 代码更少。它还避免了 SVG 在跨浏览器兼容性方面的一些问题。
关于技巧 4,我认为你永远不要在使用图标时添加以 `px` 为单位的边距。你最有可能想要使用 `em`,以便你的样式随着不同字体大小的可缩放。
我只是想说同样的话。
+1 支持这个观点。
你忘了连字方法!我最喜欢的方法!
与 `:before` 伪元素方法相比,它使得图标的定位更容易,因为使用连字,你只有一个盒子(`i`),而不是两个盒子(`i` 和 `:before`)。
它也对屏幕阅读器友好。
`i` 元素并非用于图标(尽管很多人似乎认为它适合(我猜是因为它以“i”开头))。阅读这篇文章了解更多信息:http://html5doctor.com/i-b-em-strong-element/。此外,如果你只显示一个图标,`title` 属性也可以很好地工作。
最后,为什么说 `:before` 的样式比其他元素更难?它们的行为都一样(除了少数与表单相关的元素)。
我个人使用 gulp-fontello。对齐通常不是问题。
#tip3:与其使用图标大小的左上角或边距来匹配字体大小,我习惯于设置与字体大小相同的行高,并将垂直对齐设置为居中以定位它。
我将这种技术(行高 + 字体大小)与 `::before` 结合使用,并使用前面提到的背景图像技术,从而获得大小和定位的终极灵活性。