用字体排列和比例来改进UI元素的图标

138 阅读4分钟

在用户界面元素中使用图标是有帮助的。除了元素的标注,图标可以帮助强化用户元素对用户的意图。但我不得不说,我在浏览网页的时候注意到了一点图标的错位。即使图标的对齐方式是正确的,当元素的排版样式发生变化时,图标也往往不能很好地响应。

我注意到了几个真实的例子,我想分享一下我对如何改进它们的想法。我希望这些技术可以帮助其他人建立用户界面元素,以更好地适应排版变化,同时坚持设计的原始目标。

例子1--网站信息传递

我在一个流行的媒体网站上发现了这个信息传递的例子。图标的位置看起来不是很糟糕。但是当改变元素的一些样式属性如font-sizeline-height ,它就开始解体了。

识别的问题

  • 图标被absolutely定位在使用相对单位的左边缘 (rem)
  • 因为图标被移出了流程,所以父节点被赋予了一个更大的padding-left ,以帮助整体的间距--理想情况下,我们的padding-x是统一的,无论图标是否存在,一切都看起来不错。
  • 图标(它是一个SVG)的大小也是以rems为单位的--这不允许在其父级的font-size 变化时各自调整大小。

建议

Screenshot of the site messaging element. It is overlayed with a red-dashed line indicating the icon's top edge and a blue-dashed line indicating the text's topmost point. The red-dashed line is slightly higher than the blue-dashed line.

指明图标和排版的对齐问题。

我们希望我们的图标的上边缘在蓝色虚线上,但我们经常发现我们的图标的上边缘在红色虚线上。

你是否曾经在一些文字旁边插入一个图标,但它就是不与文字的顶部对齐?你可以用类似position: relative; top: 0.2em 的东西将图标移到适当的位置。这样做的效果很好,但如果将来排版风格发生变化,你的图标可能会看起来不对位。

我们可以更可靠地定位我们的图标。让我们使用元素的基线距离(从一行的基线到下一行的基线的距离)来帮助解决这个问题。

Screenshot of the site messaging element. It is overlayed with arrows indicating the baseline distance from the baseline of one line to the next line's baseline.

计算基线距离。

基线距离是font-size * line-height

我们将把它储存在一个CSS自定义属性中。

--baselineDistance: calc(var(--fontSize) * var(--lineHeight));

然后,我们可以使用**(基线距离-字体大小)/2**的结果来向下移动我们的图标。

--iconOffset: calc((var(--baselineDistance) - var(--fontSize)) / 2);

font-size1rem (16px)和line-height 1.5 的情况下,我们的图标将被移动4个像素。

  • 基线距离 =16px * 1.5 =24px
  • 图标偏移 = (24px -16px) / 2 =4px

例子2--无序列表

我发现的第二个例子是一个无序的列表。它通过一个::before 伪元素为其图标使用了一种网络字体(Font Awesome)。关于有序列表和无序列表的样式设计,已经有很多 很好的文章,所以我就不详细介绍相对较新的 ::marker 伪元素之类的东西了。网页字体通常可以很好地与图标对齐,这取决于使用的图标。

已确定的问题

  • 没有使用absolute 定位 - 当使用伪元素时,我们不经常使用flexbox,如我们的第一个例子,absolute 定位在这里大放异彩
  • 列表项使用了padding 和负text-indent 的组合来帮助布局--当考虑到多行文本和图标的可伸缩性时,我从来没有能够让它工作得很好。

建议

因为我们的解决方案中也会使用一个伪元素,所以我们会利用absolute 定位。这个例子的图标尺寸比它相邻的文案要大一些(大约2倍)。正因为如此,我们将改变计算图标top 位置的方式。我们的图标的中心应该与第一行的中心垂直对齐。

从基线距离的计算开始。

--baselineDistance: calc(var(--fontSize) * var(--lineHeight));

使用**(基线距离-图标大小)/2**的结果向下移动图标。

--iconOffset: calc((var(--baselineDistance) - var(--iconSize)) / 2);

因此,在1rem (16px)的font-size1.6line-height ,以及一个2倍于副本的图标(32px),我们的图标将得到一个-3.2像素的顶部值。

  • 基线距离 =16px * 1.6 =25.6px
  • 图标偏移 = (25.6px -32px) / 2 =-3.2px

用较大的2rem (32px)的font-size,1.2line-height, 和64px 的图标,我们的图标将得到一个-12.8像素的顶值。

  • 基线距离 =32px * 1.2 =38.4px
  • 图标偏移 = (38.4px -64px) / 2 =-12.8px

结论

对于用户界面的图标,我们有很多选择和技术。我们有SVG、网络字体、静态图像、::marker ,以及list-style-type 。人们甚至可以使用background-colors和clip-paths来实现一些有趣的图标效果。执行一些简单的计算可以帮助以一种更优雅的方式对齐和缩放图标,从而使实现更加防弹。