悬停时更改 SVG 的颜色

Avatar of Chris Coyier
Chris Coyier

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

有许多不同的方法可以使用 SVG。根据使用方式,在不同状态或条件下(:hover:active:focus、类名更改等)重新着色 SVG 的策略也会有所不同。

让我们看看这些方法。

内联 SVG

内联 SVG 是 我最喜欢的使用 SVG 的方式,部分原因是它很容易访问和设置 SVG 的样式。

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的
bJXNyy

CodePen 上。

如果您习惯于使用图标字体,您可能会喜欢它们易于更改颜色的特性。与 SVG 不同,图标字体在很大程度上局限于单色,但仍然可以非常方便地使用 color 更改单色。使用内联 SVG 允许您设置 fill,它会级联到 SVG 内的所有元素,或者您可以在需要时单独填充每个元素。

SVG 符号 / 使用

存在 SVG 雪碧,它是一组被转换为 <symbol> 元素的 SVG,这样任何给定图标都可以使用 <use> 元素轻松引用。

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的
使用 SVG 悬停

CodePen 上。

您仍然可以通过外部 CSS 很容易地设置填充颜色,但有一些注意事项。

  • 内部 SVG 元素(如 <path>)本身可能没有填充。这允许从父 SVG 设置的填充级联到 <use> 创建的 Shadow DOM。一旦您在 <symbol> 中有类似 <path fill="blue" ... /> 的内容,您将失去对外部 CSS 的控制。
  • 同样,您无法像在内联 SVG 中那样在 SVG 中控制单个元素的 fill。这意味着您基本上处于单色状态。这涵盖了大多数用例,但无论如何,它仍然是一个限制。

SVG 背景图像

SVG 可以像 PNG、JPG 或其他任何图形格式一样被设置为背景图像。此时,您基本上放弃了更改 fill 的能力。一种可能性(我认为不是特别好的可能性)是为每个图标创建两个版本,分别使用不同的颜色,并在它们之间切换

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的
背景 SVG 悬停

CodePen 上。

如果您不想切换源,那么另一种可能性是 使用过滤器

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的
使用过滤器的背景 SVG 悬停

CodePen 上。

尝试找到合适的过滤器来获得正确的颜色是一件很棘手的事情。幸运的是,Barrett Sonntag 创建了一个工具 来为您计算过滤器!将黑色更改为红色最终会得到这样的奇特组合:invert(27%) sepia(51%) saturate(2878%) hue-rotate(346deg) brightness(104%) contrast(97%);

SVG 还有 object,它很酷的一点是它在过去曾经有一个内置的备用方案——尽管现在浏览器的支持非常好,我老实说从未使用过它。但是,如果您使用它,您可能必须使用这种 filter 技术来在悬停时切换颜色。

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的
背景 SVG 对象悬停

CodePen 上。

使用蒙版而不是背景图像

通过这种方式,SVG 仍然负责绘制形状,但颜色来自它后面的 background-color(或图像!或渐变!)而不是 SVG 本身。

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的
使用蒙版的背景 SVG 悬停

CodePen 上。

SVG 背景图像作为数据 URL

这与上面的方法并没有太大区别,但它确实开辟了一种有趣的可能性:使用变量来表示内部填充。以下是使用 Sass 将 URL 保持为变量的示例

查看 CodePen 上 Chris Coyier (@chriscoyier) 编写的
使用数据 URL 变量的背景 SVG 悬停

CodePen 上。

您也可以使用 原生 CSS 自定义属性 来实现这一点!