SVG图片修改颜色的方法--mask遮罩、filter滤镜和filter阴影三种方法对比

4,989 阅读3分钟

SVG图片修改颜色的方法--mask遮罩、filter滤镜和filter阴影三种方法对比

以图片方式插入HTML的SVG是不能通过CSS设置颜色的,相当于已经渲染的图片。改变颜色的方法思路和PNG图片一样,下面对比三种实现方法。

方法

一、mask遮罩

最简单的就是css的mask遮罩了,只要把背景颜色设为目标色,然后用图片遮罩,图片不透明的部分会被抠出露出背景,达到效果。

.example{
    background-color:gold;
    mask: url("./xxx.svg");
}

解释:

  • 把一个div背景设为金色
  • 使用目标图片遮罩

优点

简单方便。

缺点

属于实验特性,兼容性非常差。只有chrome支持,而且需要加webkit前缀。官方文档

二、filter滤镜:通过色调、饱和度等组合近似渲染颜色

原理是通过色彩坐标系的转换,将rgb转换为亮度,色度等值,再通过滤镜渲染。

.example{
    filter: invert(52%) sepia(82%) saturate(2494%) hue-rotate(327deg) brightness(104%) contrast(92%);
}

优点

色彩接近,能用。

缺点

首先需要转换工具,其次不具可读性。最重要的是颜色转换并非线性,还有白点色温,gamma等参数影响精度,任何颜色转换矩阵都会产生误差值,这在无必要的误差严格编程领域是不被允许引入的。

三、filter阴影

解决思路是使用投射阴影,再隐藏原图。难点在于隐藏原图,因为在chrome里有个优化机制,一般会对超出窗口的原图部分忽略其阴影的渲染。解决方法是利用滚动条来隐藏。

  .icon {
      width: 60px;
      overflow: hidden;

      img {
        width: 60px;
        height: 60px;
        padding: 0px;
        margin: 0px;
        border-right: 60px solid transparent;       
        filter: drop-shadow(60px 0px 0px gold);
        position: relative;
        left: 60px;
      }
    }

解释:

  • 外围容器一倍宽的窗口,隐藏滚动条。
  • 图像右边框设为透明一倍宽,整体共两倍宽长度,触发滚动条,给阴影的显示占位
  • 向右一倍宽投射阴影
  • 相对左移一倍宽,隐藏原图显示

优点

准确符合预期实现效果。推荐使用。

缺点

设计巧妙但可能有点冗长。

总结

SVG图片修改颜色是很常见的需求,然而如果以图像形式引入,则不能像字体或边框之类能直接css更改前景色,而需要像对待PNG图片一样处理。

本文讨论了三种图片修改颜色的方法,并推荐最佳方法是通过阴影投射来解决。该方法的设计实现有一定的巧妙之处,在一定程度上考验知识的综合运用能力。

参考

  1. css - How to change the color of an svg element? - Stack Overflow
  2. PNG格式小图标的CSS任意颜色赋色技术 « 张鑫旭-鑫空间-鑫生活
  3. 纯CSS实现任意格式图标变色的研究 « 张鑫旭-鑫空间-鑫生活
  4. mask-image - CSS(层叠样式表) | MDN
  5. filter - CSS(层叠样式表) | MDN