以下是 Parker Bennett 的客座文章。虽然字体图标高效易用且可扩展等等,但其经典的“缺点”之一就是图标只能使用一种颜色。Parker 有一个全新的项目,以一种简单巧妙的方式解决了这个问题。我让他来为您介绍一下。
即使 图标的未来 很可能属于 SVG,但在当下,字体图标仍然提供了一种引人注目的替代方案——只需使用 CSS 即可轻松地设置颜色、大小、文本阴影、悬停效果等样式。字体图标 仍然很棒。
SVG 相比字体图标的一大优势在于全彩色。但字体图标不必局限于单色。通过叠加两个或多个元素,我们可以使用现代扁平化风格创建独特的“多色”图标。如果您曾经做过任何双色或丝网印刷,那这和它的原理类似。
我称之为 Stackicons。
对于每种颜色,我们使用一个单独的伪元素,然后使用绝对定位将它们彼此叠加。(如果想要超过两种颜色,则需要使用非语义化的 span 元素。)
/* @font-face to load icon font... */
/* horizontal button row: inline-block vs float makes positioning easier using text-align */
/* any class that starts with "st-icon-" */
[class^="st-icon-"] {
display: inline-block;
vertical-align: top;
white-space: nowrap;
/* child elements absolute */
position: relative;
/* remove inline-block white-space */
margin-right: -.16em; /* 5px */
/* if not already universally applied */
-moz-box-sizing: border-box;
-webkit-box-sizing: border-box;
box-sizing: border-box;
/* padding here for text, icons replicate this using size and position:absolute - padding makes touch-target bigger */
padding: 0.143em;
/* units used in font: 1em = 2048, icons 2400 wide, so icons are 1.171875em (2400/2048). Add padding x2 to get size: */
height: 1.45788em;
width: 1.45788em;
font-size: 1.815em;
/* text hidden old-school */
text-align: left;
text-indent: -9999px; }
/* position:absolute stacks pseudo elements - extra <span> in markup = 2 extra pseudo elements */
[class^="st-icon-"]:before,
[class^="st-icon-"]:after,
[class^="st-icon-"] span:before,
[class^="st-icon-"] span:after {
display: block;
position: absolute;
white-space: normal;
/* match padding above */
top: 0.143em;
left: 0.143em;
/* undo text hidden */
text-indent: 0;
/* inherits size from parent, ems cascade */
font-size: 1em;
font-family: "Stackicons-Social";
font-weight: 400 !important;
font-style: normal !important;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-smoothing: antialiased;
/* screenreaders */
speak: none;
/* transitions here */ }
.st-icon-amazon:before {
/* character code - unicode private use area */
content: "\e079"; /* black "a" */
color: black; }
.st-icon-amazon:hover:before {
color: #626262; }
.st-icon-amazon:after {
content: "\e080"; /* orange smile */
color: #ff9900; }
.st-icon-amazon:hover:after {
color: #ffbd59; }
使用 rgba 值,我们甚至可以进行一些颜色混合以获得更多颜色。如果我们真的想要突破限制,可以使用 -webkit-background-clip: text
为图标提供 -webkit-linear-gradient
背景。
是的,这有点像“黑客”手段:它需要一些设计上的预先思考,以及生成字体图标的能力。需要管理更多活动部件。但它也提供了很大的灵活性,尤其是在使用 Sass 变量时。
Stackicons-Social
为了展示其工作原理,我创建了一个免费的开源字体图标,Stackicons-Social,并创建了一个 Sass“构造工具包”来生成单色图标和 60 多个社交品牌的“多色”版本的 CSS。
Stackicons-Social
我还创建了一系列字体按钮形状,从方形到圆形(以及仅图标),并且可以使用类动态覆盖形状。想要圆形图标?只需添加 .st-shape-circle
类即可。iOS 风格?.st-shape-rounded3.
使用 Sass 整合
在幕后,有一组 .scss _partial 文件由 Sass 编译。如果您熟悉 Sass,则只需更改此“构造工具包”中的变量即可广泛定制内容
- fonts-stackicons-social – Stackicons-social 字体的路径。
- colors-social–2014 – 社交品牌的颜色变量。
- unicodes-stackicons-social – 将字体 Unicode 字符抽象为变量。
- construction-kit-stackicons-social – 在这里,我们生成图标大小、边距、填充、形状、颜色、悬停样式等的默认值。(在此处进行操作。)
- css-defaults-stackicons-social – 这会完成创建每个 .st-icon-($brand) 类的 CSS 基础工作。*
- override-shapes-stackicons-social – 允许您使用类覆盖单色图标上的按钮形状:st-shape-square 到 st-shape-circle,以及 st-shape-icon。*
- override-colors-stackicons-social – 单色图标的“颜色样式”示例,以演示不同的选项。有很多额外的 CSS,因此默认情况下已注释掉。*
- multi-color-kit-stackicons-social.scss – 与上面的“构造工具包”类似,但适用于 .st-multi-color 类:生成默认形状、颜色样式等。
- multi-color-css-stackicons-social.scss – 与上面的“css-defaults”类似,这会完成生成每个多色 .st-icon-($brand) 类的 CSS 基础工作。*
- multi-color-override-shapes-stackicons-social – 这允许您使用多色图标上的类更改图标形状。*
* 由于 Sass 不允许我们在变量中使用变量,因此它使用大量的 @if
语句来生成 .st-icon-($brand)
类。很难看,但勉强可以维护。有几个 @each
语句,列出了要输出的品牌。理想情况下,您需要遍历并编辑这些列表,以将 CSS 输出限制为您需要的品牌。
自己动手
有一些很棒的免费资源可用于创建字体图标,包括 icomoon.io 和 fontello.com。我在 Mac 上使用 Adobe Illustrator 和 Glyphs。(Glyphs Mini 是一个更低成本的选择,它将每个 em 的单位限制为 1000。他们也提供学生价格。)为了生成网络字体版本,我推荐 FontPrep,Brian Gonzalez 刚刚将其开源。 FontSquirrel 是另一个不错的免费选项。(如果您有兴趣了解更详细的工作流程,请在评论中告诉我。)
您还应该查看 某个随机家伙(P.J. Onori)及其 标志性项目。他还有一些关于 正确使用字体图标的有用提示。
与往常一样,如果您有任何问题、意见或更正,您可以发送电子邮件至 parker@parkerbennett.com。
它们看起来太棒了。这让我对 SVG 的新可能性有了新的认识。谢谢 Parker!
我想在我的博客博客中添加 Blogger 和 Github Stackicons,有什么简单的解决方案?。
我还发现许多自定义字体,但它们不包含 Blogger 图标 :)
看起来很酷,但也似乎比仅仅使用简单的图像图标更重一些。您认为主要的优势是什么?
文件更小,可以高质量地放大和缩小,响应式,CSS过渡、动画、阴影、边框、颜色…
@WillB。
1) 无需为高分辨率和非高分辨率显示屏准备单独的图像
2) 无需额外的http请求来获取图像。
3) @Kyrodes所说的
出于某种原因,我还没有尝试过,所以只是问问这个。但是,您不能只从Illustrator导出多色矢量图形并使用它而不是其中一个吗?
可以,但您对所述图标的样式控制不会那么多。
所以,如果您已经知道您的颜色将是什么,那么您就可以了?我愿意尝试任何好主意,但我只是在比较在Illustrator中使用吸管更改颜色并重新保存所需的时间长度,以及在样式表中查找和更改伪选择器颜色所需的时间长度。但话说回来,加载时间有什么区别,因为这也是一个因素?
我最好做一些实验……除非这里有人已经做过这个?
如果您想在多个地方使用相同图标并应用多种样式,该怎么办?您要么需要创建x个图像,要么在您的字体中使用1个图标,并在x个位置应用x个样式。我个人觉得后者更容易。
如果您不担心动态更改颜色或其他内容,SVG 可以完美工作。当我想让某个图标在 :hover 时更改颜色时,我使用图标字体。对于 SVG,这将意味着交换两个单独的文件,或者可能使用一些花哨的 JavaScript 操作 SVG。然后是另一个用于 :active 的 SVG 文件。这并非不可能,但需要大量的工作。使用图标字体,您只需将图标视为字符。能够在 CSS 中操作图标还可以额外带来一个好处,即使添加颜色属性的过渡变得超级简单。
嗨,Cory,这是一个非常好的观点!这就是我想听到的东西。
这很大程度上取决于您如何使用它们。如果您使用内联
<svg>
,则可以在绝对更改其各个方面(包括背景)的 CSS 中定位形状。但是,如果您使用 svg-as-img 或 background-image,则无法这样做。嗨,Chris,吸引人的地方在于您在动画过程中可以控制。将形状和颜色变形为各种其他形状和颜色。我还没有尝试过任何这些技术,但会尝试。
使用字体图标而不是图像图标以及雪碧图的麻烦,您已经可以获得一些优势。作者在文章中提到了几个优点,例如可缩放、高效、CSS“可样式化和可动画化”。
没有提到浏览器兼容性。
我们可以期待与常规字体图标相同的兼容性水平吗?
我做错什么了吗,还是 http://stackicons.com/ 和 http://www.stackicons.com/ 目前都无法访问?
比如
403 禁止访问
您没有权限在此服务器上访问 / 。
Apache/2.2.22 服务器位于 www.stackicons.com 端口 80
我也无法访问。
现在应该修复了。.htaccess 文件出错了。
超级酷的文章。实际上,我在紧急情况下堆叠和组合过字体图标,这是可行的,但远非完美。
顺便说一句,我们需要将 CodePen 图标添加到 FontAwesome 中。感谢 Parker 提供了很棒的字体图标集!
我在想……您可以使用 letter-spacing 来堆叠字符吗?显然,您需要制作一个等宽字体(我不知道 Stakicons 是否是等宽的)才能正确对齐,但您不需要所有位置属性。
这是一个很棒的想法,我非常喜欢它。虽然单色 FontAwesome 图标通常足以满足我和我的项目的需要,但我会在雨天把它放在口袋里。干得好,Parker。
SASS 生成的 CSS 中的浏览器兼容性问题是什么?
回首 80 年代,我记得在我的第一台 8 位计算机 Amstrad CPC 464 上使用过类似的技术:绘制重叠的多个字符是在 BASIC 中获得多色精灵的最简单方法 :)
老实说,我宁愿使用 svg 雪碧图而不是这个。是的,这是一种有趣的方法,但有点过头了。
不要在 Opera Mini 中打开它!
这看起来不错。但是我如何创建此技术所需的字体文件?
好问题。我也有同样的疑问。
我意识到每一层都是一个不同的字符,但有没有办法快速定位每个字符而不必猜测和检查?
正如 William 在下面提到的,http://glyphter.com/ 是创建基本图标字体的绝佳方法。
感谢这篇文章!您可以通过仅使用 CSS 在一个 HTML 元素中堆叠最多四个图标。我在上面写了一篇简短的博客文章:http://pixelambacht.nl/2014/multicolor-icons/
这将消除 HTML 中的额外
span
。我稍微更喜欢这种方法。使用 :first-letter 的好技巧。
就我个人而言,我认为单色字体看起来更简洁,但这确实是一个不错的技巧;已收藏。 :)
Glyphter.com 是另一个创建图标字体的良好资源。
http://fontawesome.io 已经这样做了,并且内置了用于分层图标的类。
我的朋友和同事 Nik Wise 和 Paul Pederson 去年做了类似的事情,专注于使用连字进行语义回退。不同的技术,但非常相似的概念。值得一看
github.com/nikolaswise/three-color-icons
paulcpederson.com/articles/devicons
nikolaswise.github.io/devicons
我认为 svg 有一些功能,很多人并不知道。
了解的人应该告知其他人,以便他们更多地了解 svg 拥有的这些巨大可能性。
太棒了!我用你的精彩教程制作了一些信用卡的叠加图标
http://williamrandol.github.io/CreditCardIconFont/