如何在使用时改变SVG图案的颜色?

时间:2017-04-15 07:11:26

标签: svg colors svg-filters

我想在使用时更改图案的颜色。

例如,我想在红色的抚摸圆圈中有一个绿色图案。

<svg width="300" height="300" viewBox="0 0 300 300"
    xmlns="http://www.w3.org/2000/svg">
  <defs>
    <pattern id="checked" width="2" height="2" stroke="black" stroke-linecap="square" stroke-width="1" patternTransform="rotate(45) scale(2)"
        patternUnits="userSpaceOnUse">
      <line x1="0" y1="0" x2="0" y2="2"></line>
      <line x1="0" y1="0" x2="2" y2="0"></line>
    </pattern>
  </defs>
  <circle cx="60" cy="60" r="50" stroke="red" fill="url(#checked)"/>
  <circle cx="120" cy="60" r="50" stroke="blue" fill="url(#checked)"/>
</svg>

http://codepen.io/anon/pen/RVNmRY

是否可以在不必为每种颜色创建新图案的情况下这样做?

我在评论中读到这可能是使用过滤器(https://stackoverflow.com/a/21427316/1981832)。但我不知道如何。

2 个答案:

答案 0 :(得分:2)

以下是使用“蓝屏”技术使用滤镜重新着色形状的方法。滤镜单独留下红色成分(矩阵中的前1个),将蓝色转换为绿色(下一个“1”)并保持不透明度不变(最终“1”)。这个特定的过滤器显然只适用于您的示例,但您可以编写更通用的过滤器,以使用特定的源颜色作为将要转换为其他颜色的颜色。

<svg width="300" height="300" viewBox="0 0 300 300"
    xmlns="http://www.w3.org/2000/svg">
  <defs>
  <filter id="blue-to-green">
     <feColorMatrix type="matrix" values="1 0 0 0 0
                                          0 0 1 0 0 
                                          0 0 0 0 0 
                                          0 0 0 1 0"/>
  </filter>
  
    <pattern id="checked" width="2" height="2" stroke="blue" stroke-linecap="square" stroke-width="1" patternTransform="rotate(45) scale(2)"
        patternUnits="userSpaceOnUse">
      <line x1="0" y1="0" x2="0" y2="2"></line>
      <line x1="0" y1="0" x2="2" y2="0"></line>
    </pattern>
  </defs>
  
  <circle cx="60" cy="60" r="50" stroke="red" fill="url(#checked)" filter="url(#blue-to-green)"/>
  <circle cx="120" cy="60" r="50" stroke="blue" fill="url(#checked)"/>
</svg>

答案 1 :(得分:0)

如果您用所需的颜色填充圆圈,然后将图案用作蒙版,则可以使用。这是绿色和洋红色的示例:

<svg width="300" height="300" viewBox="0 0 300 300"
    xmlns="http://www.w3.org/2000/svg">
  <defs>  
    <pattern id="checked" width="2" height="2" stroke="white" stroke-linecap="square" stroke-width="1" patternTransform="rotate(45) scale(2)"
        patternUnits="userSpaceOnUse">
      <line x1="0" y1="0" x2="0" y2="2"></line>
      <line x1="0" y1="0" x2="2" y2="0"></line>
    </pattern>
    <mask id="checked-mask" x="0" y="0" width="1" height="1" >
      <rect x="0" y="0" width="1000" height="1000" fill="url(#checked)" />
    </mask>
  </defs>  
  <circle cx="60" cy="60" r="50" stroke="red" mask="url(#checked-mask)" fill="green" />
  <circle cx="120" cy="60" r="50" stroke="blue" mask="url(#checked-mask)" fill="magenta" />
</svg>