级联 SVG 填充颜色

Avatar of Chris Coyier
Chris Coyier 发布

DigitalOcean 为您旅程的每个阶段提供云产品。立即开始使用 200 美元的免费额度!

有一次,有人告诉我他们使用 SVG 图标遇到的最大问题是,图标的颜色与旁边的文本颜色不匹配。事实上,这个问题对他们来说非常严重,以至于尽管看到了 SVG 图标的优势,他们仍然坚持使用图标字体。当时我没有想到,但这个问题其实有一个非常简单的解决方案。

这个想法是使用 CSS 中的 currentColor 值,将文本颜色传递给 SVG 形状。例如

<h1>
  <svg viewBox="0 0 32 32">
    <use xlink:href="#icon-phone"></use>
  </svg>
  Call Me
</h1>
h1 {
  color: blue;
}
h1 svg {
  fill: currentColor;
}

您可以简化此操作,并让填充级联到 SVG

h1 {
  color: blue;
  fill: currentColor;
}

所以填充会级联,是不是很巧妙?如果这么简单,为什么我们不直接这么做呢?

body {
  fill: currentColor;
}

fill 仅影响 SVG,因此它不会做我们不想做的事情,并且可以通过更具体的选择器轻松覆盖。

问题是,它并不能直接按预期工作。

以这个例子为例,它只是我们原始示例在 <body> 中的内容

<body>
<h1>
  <svg viewBox="0 0 32 32">
    <use xlink:href="#icon-phone"></use>
  </svg>
  You'd think the SVG would fill blue too?
</h1>
</body>

然后

body {
  fill: currentColor;
  color: red;
}
h1 {
  color: blue;
}
svg {
  border: 5px solid currentColor;
}

<svg> 的 currentColor 是什么?是 blue,对吧?因为 color 会级联(继承)。我们可以看到这是正确的,因为该 svg 上的边框将是蓝色。但是图标本身(实际上是一个绘制的 <path>将是 red

很奇怪,我认为。

更新:Chrome 现在(正常)工作了。Firefox 和 Safari 仍然显示奇怪的红色填充。

但这并不是什么大问题,因为您可以

svg {
  fill: currentColor;
}

这将确保它从您通常期望它获取的颜色中获取颜色。您还可以将填充应用于 use、path、symbol、circle、rect 等,但是点击 svg 就可以覆盖所有内容(这对于简单的单色用例来说很好)。

查看 Chris Coyier 在 CodePen 上创建的 Pen lcDBd@chriscoyier)。