用颜色填充 SVG 路径,但使用悬停淡入模式

Posted

技术标签:

【中文标题】用颜色填充 SVG 路径,但使用悬停淡入模式【英文标题】:Fill SVG path with colour but on hover fade-in pattern 【发布时间】:2017-09-23 00:26:58 【问题描述】:

我正在尝试添加 SVG 图像(在本例中为比利时国旗)作为 SVG 路径(实际上是椭圆)的填充。悬停时,椭圆的填充必须变为红色。换句话说,填充 SVG 必须“淡出”。我尝试了一种使用 CSS 的方式,但 SVG 模式和过渡似乎都不起作用。我在 Chrome 和 Firefox 上试过。

svg ellipse 
  fill: url(#img1);
  transition: fill 400ms;


svg:hover ellipse 
  fill: red;
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" version="1.1"   viewBox="0 0 640 480">
  <defs>
    <pattern x="0" y="0" id="img1"   viewBox="0 0 640 480">
        <g fill-rule="evenodd" stroke->
          <path d="M0 0h213.335v479.997H0z" />
          <path fill="#ffd90c" d="M213.335 0H426.67v479.997H213.335z" />
          <path fill="#f31830" d="M426.67 0h213.335v479.997H426.67z" />
        </g>
    </pattern>
  </defs>
  <rect fill="none" stroke="blue" x="1" y="1"  />
  <ellipse stroke="black" stroke- cx="400" cy="200" rx="350" ry="150" />
</svg>

【问题讨论】:

我不确定您是否可以使用图像来执行此操作,但是使用初始化填充为白色而不是 url(#img1) 来执行此操作。 ***.com/questions/20012240/… 【参考方案1】:

你不能像那样过渡fill,因为这两个填充不是可以在它们之间平滑插值的东西。

您需要做的是有两个版本的椭圆,一个在另一个之上。然后淡入或淡出顶部。

.visible-on-hover 
  transition: opacity 400ms;
  opacity: 0;


.visible-on-hover:hover 
  opacity: 1;
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:ev="http://www.w3.org/2001/xml-events" version="1.1"   viewBox="0 0 640 480">
  <defs>
    <pattern x="0" y="0" id="img1"  
             viewBox="0 0 640 480" preserveAspectRatio="xMidYMid slice">
        <g fill-rule="evenodd" stroke->
          <path d="M0 0h213.335v479.997H0z" />
          <path fill="#ffd90c" d="M213.335 0H426.67v479.997H213.335z" />
          <path fill="#f31830" d="M426.67 0h213.335v479.997H426.67z" />
        </g>
    </pattern>
  </defs>
  <rect fill="none" stroke="blue" x="1" y="1"  />
  <ellipse stroke="black" stroke- cx="400" cy="200" rx="350" ry="150" fill="url(#img1)"/>
  <ellipse stroke="black" stroke- cx="400" cy="200" rx="350" ry="150" fill="red" class="visible-on-hover"/>
</svg>

【讨论】:

不过,我还有一个问题。为什么图案的宽度/高度指定为1?使用fill时,会自动覆盖整个路径吗? (类似于background-size: cover 的工作原理?) 这些属性(x,y,width,height)的默认坐标空间是patternUnits="objectBoundingBox"。这意味着它们是相对于元素的边界框的。 (0,0) 是元素的左上角; (1,1) 是元素的右下角。 See the SVG spec section on Patterns.

以上是关于用颜色填充 SVG 路径,但使用悬停淡入模式的主要内容,如果未能解决你的问题,请参考以下文章

悬停时更改 SVG 填充和文本突出显示颜色

在悬停另一个元素时更改 SVG 填充颜色

悬停按钮时如何更改svg颜色

svg中线性渐变颜色的悬停事件

悬停链接并在 SVG 中更改颜色 [重复]

如何淡入和淡出svg的颜色