你一个前端,svg图片改色都不会?都给我卷起来

36,155 阅读3分钟

周六来公司写点东西,刚好有个icon颜色不对,ui又不在公司,那么就只能自己动手丰衣足食了。

呜呜呜,好想住公司,都不用上下班了。

当ui给你了svg图片,且是单色的,又只有你用

svg填充色用的fill,修改里面的颜色即可。下面是例子:

首先,ui一般会直接给你svg图片,比如这样的:demo1.svg,用idea或者笔记本打开里面是这样的:

<?xml version="1.0" encoding="UTF-8"?>
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <title>元件/组件图标/提示/面</title>
    <g id="元件/组件图标/提示/面" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <path d="M8,16 C3.581722,16 0,12.418278 0,8 C0,3.581722 3.581722,0 8,0 C12.418278,0 16,3.581722 16,8 C16,12.418278 12.418278,16 8,16 Z M7.5,11.5 C7.5,11.7762581 7.72387097,12 8,12 C8.27612903,12 8.5,11.7762581 8.5,11.5 C8.5,11.2237419 8.27612903,11 8,11 C7.72387097,11 7.5,11.2237419 7.5,11.5 Z M8,4 C7.72385763,4 7.5,4.22385763 7.5,4.5 L7.5,9.5 C7.5,9.77614237 7.72385763,10 8,10 C8.27614237,10 8.5,9.77614237 8.5,9.5 L8.5,4.5 C8.5,4.22385763 8.27614237,4 8,4 Z" id="icon换色层" fill="#f2b044"></path>
    </g>
</svg>

搜索关键词,找到id="icon换色层" fill="#f2b044",替换fill的值为#df2222,那么就变成红色了unAuth.svg。你可以试试。

当你用的公司统一的svg格式的icon,但是颜色和这次的需求不一致,直接改svg文件可能影响其他显示,可以考虑css

看到这个,有人就要说了,还不如按方法1,改个颜色,然后复制下文件改名,粘贴,简单粗暴。

确实,可惜我们是前端,一点点优化也是优化,一点点体积也是体积(一点点味道一般,还是蜜雪冰城好喝)。css改色利用的是过滤器filter的drop-shadow属性,它的功能是可定点定位生成一个可调整模糊度以及颜色的投影,卧槽,真牛,感觉能做好多炫酷的东西,属实是彩色影分身术了。

具体代码:

<div style="position: relative; width: 20px; height: 20px; border: 1px solid;">
    <img src="./svg/img/demo1.svg" style="position:absolute; top: 0; left: 0; filter: drop-shadow(20px 0 #32bb65)"/>
</div>

效果如下:

image.png

然后我们调整下原本icon的位置,将它往左挪出去:left:-20px,代码如下:

<div style="position: relative; width: 20px; height: 20px; border: 1px solid;">
  <img src="./svg/img/demo1.svg" style="position:absolute; top: 0; left: -20px; filter: drop-shadow(20px 0 #32bb65)"/>
</div>

image.png

最后我们去掉方便识别的边框,并给div加上overflow:hidden,一个简单的icon改色就完成了!!好棒!!。

image.png

最后顺便介绍下filter: drop-shadow()

filter: drop-shadow(x, y, blurry, color),第一个参数距离源x轴的像素大小,第二个参数是距离源y轴的像素大小,第三个是模糊度,第四个是投影的颜色。

这是mdn的资料,有个很好看的实现:developer.mozilla.org/zh-CN/docs/…

image.png

这个蓝色底就是drop-shadow实现的。

最后看我多重影分身之术:drop-shadow(20px 0 red) drop-shadow(20px 20px green) drop-shadow(20px 39px blue) drop-shadow(20px 0 skyblue)

image.png

原图是橙色,第一次是红色,第二次是绿色,第三次是蓝色,第四次是天蓝,每多一次drop-shadow,都会把上一次的图像复制一次,把上一次的作为原图进行投影,是裂变了没错!!

补充(2022/07/28更新)

感谢掘友:hboot朽木_Xenon 的建议,学习到了更多,现在补充上。

image.png

image.png

svg使用currentColor变更颜色的实现

还是使用我们的svg,只不过我们将<path>标签一层的fill="#f2b044"改为`fill="currentColor",:

<path d="M8,16 C3.581722,16 0,12.418278 0,8 C0,3.581722 3.581722,0 8,0 C12.418278,0 16,3.581722 16,8 C16,12.418278 12.418278,16 8,16 Z M7.5,11.5 C7.5,11.7762581 7.72387097,12 8,12 C8.27612903,12 8.5,11.7762581 8.5,11.5 C8.5,11.2237419 8.27612903,11 8,11 C7.72387097,11 7.5,11.2237419 7.5,11.5 Z M8,4 C7.72385763,4 7.5,4.22385763 7.5,4.5 L7.5,9.5 C7.5,9.77614237 7.72385763,10 8,10 C8.27614237,10 8.5,9.77614237 8.5,9.5 L8.5,4.5 C8.5,4.22385763 8.27614237,4 8,4 Z" id="icon换色层" fill="currentColor"></path>

currentColor是取当前标签/或者上级标签的字体颜色的值,所以我们在svg标签或者上级标签设定color为#df2222,就能实现颜色的变化unAuth.svg,非常方便。具体如下:

<div style="color: #df2222">
    <svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
        <title>元件/组件图标/提示/面</title>
        <g id="元件/组件图标/提示/面" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
            <path d="M8,16 C3.581722,16 0,12.418278 0,8 C0,3.581722 3.581722,0 8,0 C12.418278,0 16,3.581722 16,8 C16,12.418278 12.418278,16 8,16 Z M7.5,11.5 C7.5,11.7762581 7.72387097,12 8,12 C8.27612903,12 8.5,11.7762581 8.5,11.5 C8.5,11.2237419 8.27612903,11 8,11 C7.72387097,11 7.5,11.2237419 7.5,11.5 Z M8,4 C7.72385763,4 7.5,4.22385763 7.5,4.5 L7.5,9.5 C7.5,9.77614237 7.72385763,10 8,10 C8.27614237,10 8.5,9.77614237 8.5,9.5 L8.5,4.5 C8.5,4.22385763 8.27614237,4 8,4 Z" id="icon换色层" fill="currentColor"></path>
        </g>
    </svg>
</div>

另外补上:复杂形状的svg颜色变更

这个有一定的前提要求,复杂图形需要每个图形分开的,比如:

<?xml version="1.0" encoding="UTF-8"?>
<svg width="36px" height="36px" viewBox="0 0 36 36" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
    <title>Img/Touziz-Default</title>
    <g id="Img/Touziz-Default" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
        <g transform="translate(2.000000, 0.000000)" fill-rule="nonzero">
            <polygon id="路径" fill="#B8B8B8" points="31.4430123 35.8320776 0.55703888 35.8320776 16.0000256 9.0839996"></polygon>
            <path d="M4,11.590832 L4,11.5908338 C4,17.9922827 9.18938494,23.1816676 15.5908338,23.1816676 C21.9922827,23.1816676 27.1816676,17.9922827 27.1816676,11.5908338 L27.1816676,11.5908338 C27.1816676,5.18938494 21.9922827,0 15.5908338,0 C9.18938494,0 4,5.18938494 4,11.5908338 L4,11.590832 Z" id="路径" fill="#ECECEC"></path>
            <g id="a-link" transform="translate(9.082049, 9.062515)" fill="#D9D9D9">
                <path d="M13.8333755,11.9990374 C11.9027873,13.4363438 9.50985482,14.287126 6.9179768,14.287126 C4.32609878,14.287126 1.93316631,13.4363438 0.002578128,11.9990374 L6.9179768,0.0214844 L13.8333755,11.9990374 Z" id="a"></path>
            </g>
        </g>
    </g>
</svg>

image.png

这块代表上边弯曲的梯形,我改颜色为红色:

<polygon id="路径" fill="red" points="31.4430123 35.8320776 0.55703888 35.8320776 16.0000256 9.0839996"></polygon>

image.png

这块代表缺了一块的圆,我改为黄色:

<path d="M4,11.590832 L4,11.5908338 C4,17.9922827 9.18938494,23.1816676 15.5908338,23.1816676 C21.9922827,23.1816676 27.1816676,17.9922827 27.1816676,11.5908338 L27.1816676,11.5908338 C27.1816676,5.18938494 21.9922827,0 15.5908338,0 C9.18938494,0 4,5.18938494 4,11.5908338 L4,11.590832 Z" id="路径" fill="yellow"></path>

image.png

这块代表底部弯曲的三角,我改为蓝色:

<path d="M13.8333755,11.9990374 C11.9027873,13.4363438 9.50985482,14.287126 6.9179768,14.287126 C4.32609878,14.287126 1.93316631,13.4363438 0.002578128,11.9990374 L6.9179768,0.0214844 L13.8333755,11.9990374 Z" id="a"></path>

image.png

真丑!

总的来说,改svg图片的颜色,就是找标签上一连串数字的部分,然后尝试改色。

另外如果这个svg用的勤,颜色换的多,可以考虑弄成组件,变量改动颜色。