Warm tip: This article is reproduced from serverfault.com, please click

html-为什么我使用蒙版重新着色的彩色SVG会使颜色比所选颜色浅?

(html - Why does the colored SVG I recolor using a mask turns the color lighter than the chosen color?)

发布于 2020-12-04 15:11:20

我有一个VueJS项目,其中我使用具有硬编码颜色的SVG,我尝试通过使用mask和rect标签遍历它们来为这些SVG提供另一种颜色。这可行,但是我看到图标索引越高,图标的颜色就越浅。我究竟做错了什么?

这是codepen示例;

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>

Questioner
Kesselfest
Viewed
0
ccprog 2020-12-05 00:45:20

如评论中所述,遮罩不是更改图标颜色的首选方法。过滤器可以做得更好。这就是我要做的。如果我为了显示结果而放弃了Vue语法,请原谅,但是我确信你可以轻松地将其移植回去。

过滤器首先用所需的颜色填充过滤器区域,然后使用Porter-Duffatop运算符将其父区域裁剪回图标的轮廓

.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>