为什么我使用蒙版重新着色的彩色 SVG 会变成比所选颜色更浅的颜色?
Why does the colored SVG I recolor using a mask turns the color lighter than the chosen color?
我有一个 VueJS 项目,我在其中使用具有硬编码颜色的 SVG,我尝试通过使用 mask 和 rect 标签循环遍历它们来为这些 SVG 赋予另一种颜色。这行得通,但我看到图标索引越高,图标的颜色就越浅。我做错了什么?
这是代码笔示例;
https://codepen.io/Kesselfest/pen/xxEZyBb
和HTML模板;
<template>
<div id="app">
<div class="flex-container">
<div v-for="icon in icons" :key="icon.name">
<div class="iconTile"> <svg viewBox="0 0 36 36">
<mask :id="`${icon.name}-mask`">
<image :href="icon.location" x="0" y="0" width="100%" height="100%" />
</mask>
<rect x="0" y="0" width="100%" height="100%" :fill="icon.color"
:mask="`url(#${icon.name}-mask)`" />
</svg> </div>
</div>
</div>
</div>
</template>
如评论中所述,遮罩不是更改图标颜色的最佳方式。过滤器可以做得更好。我就是这样做的。对不起,如果我为了显示结果而放弃 Vue 语法,但我相信你可以轻松地将其移植回来。
滤镜首先用预期的颜色填充滤镜区域,然后使用 Porter-Duff atop
运算符将其父区域剪回图标的轮廓。
.flex-container {
justify-content: space-around;
display: flex;
padding: 20px;
}
.iconTile {
margin: 0;
padding: 10px;
width: 100px;
height: 100px;
}
<div class="flex-container">
<div class="iconTile">
<svg viewBox="0 0 36 36">
<filter
id="checkmark-filter" >
<feFlood
flood-color="purple"
result="color"
/>
<feComposite
operator="atop"
in2="SourceGraphic"
in="color"
/>
</filter>
<image
href="https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Icons8_flat_checkmark.svg/768px-Icons8_flat_checkmark.svg.png"
x="0"
y="0"
width="100%"
height="100%"
filter="url(#checkmark-filter)"
/>
</svg>
</div>
<div class="iconTile">
<svg viewBox="0 0 36 36">
<filter
id="pencil-filter" >
<feFlood
flood-color="green"
result="color"
/>
<feComposite
operator="atop"
in2="SourceGraphic"
in="color"
/>
</filter>
<image
href="https://upload.wikimedia.org/wikipedia/commons/5/57/Red_pencil.svg"
x="0"
y="0"
width="100%"
height="100%"
filter="url(#pencil-filter)"
/>
</svg>
</div>
</div>
我有一个 VueJS 项目,我在其中使用具有硬编码颜色的 SVG,我尝试通过使用 mask 和 rect 标签循环遍历它们来为这些 SVG 赋予另一种颜色。这行得通,但我看到图标索引越高,图标的颜色就越浅。我做错了什么?
这是代码笔示例;
https://codepen.io/Kesselfest/pen/xxEZyBb
和HTML模板;
<template>
<div id="app">
<div class="flex-container">
<div v-for="icon in icons" :key="icon.name">
<div class="iconTile"> <svg viewBox="0 0 36 36">
<mask :id="`${icon.name}-mask`">
<image :href="icon.location" x="0" y="0" width="100%" height="100%" />
</mask>
<rect x="0" y="0" width="100%" height="100%" :fill="icon.color"
:mask="`url(#${icon.name}-mask)`" />
</svg> </div>
</div>
</div>
</div>
</template>
如评论中所述,遮罩不是更改图标颜色的最佳方式。过滤器可以做得更好。我就是这样做的。对不起,如果我为了显示结果而放弃 Vue 语法,但我相信你可以轻松地将其移植回来。
滤镜首先用预期的颜色填充滤镜区域,然后使用 Porter-Duff atop
运算符将其父区域剪回图标的轮廓。
.flex-container {
justify-content: space-around;
display: flex;
padding: 20px;
}
.iconTile {
margin: 0;
padding: 10px;
width: 100px;
height: 100px;
}
<div class="flex-container">
<div class="iconTile">
<svg viewBox="0 0 36 36">
<filter
id="checkmark-filter" >
<feFlood
flood-color="purple"
result="color"
/>
<feComposite
operator="atop"
in2="SourceGraphic"
in="color"
/>
</filter>
<image
href="https://upload.wikimedia.org/wikipedia/commons/thumb/1/13/Icons8_flat_checkmark.svg/768px-Icons8_flat_checkmark.svg.png"
x="0"
y="0"
width="100%"
height="100%"
filter="url(#checkmark-filter)"
/>
</svg>
</div>
<div class="iconTile">
<svg viewBox="0 0 36 36">
<filter
id="pencil-filter" >
<feFlood
flood-color="green"
result="color"
/>
<feComposite
operator="atop"
in2="SourceGraphic"
in="color"
/>
</filter>
<image
href="https://upload.wikimedia.org/wikipedia/commons/5/57/Red_pencil.svg"
x="0"
y="0"
width="100%"
height="100%"
filter="url(#pencil-filter)"
/>
</svg>
</div>
</div>