SVG:在悬停时将填充颜色应用于"蒙面"图像

ctr*_*del 2 javascript css jquery svg

我正在使用clipPath对图像应用不同的"蒙版"效果.

如何在悬停时用彩色填充剪裁的图像?我尝试:hover在CSS中使用,但这似乎不起作用,除非我的目标是不正确的元素.

我在这个项目中使用jQuery,所以如果需要JS解决方案,我可以依靠jQuery.

这是我正在使用的HTML:

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 100 100">
  <defs>
    <clipPath id="ellipse">
      <ellipse cx="50" cy="35.5" rx="49.5" ry="35" />
    </clipPath>
    <clipPath id="hexagon">
      <polygon points="25, 0  75, 0 100, 43.30127018922193 75, 86.60254037844386  25, 86.60254037844386  0, 43.30127018922193"/>
    </clipPath>
    <clipPath id="rectangle">
      <rect x="0" y="0" width="100" height="70"></rect>
    </clipPath>
  </defs>
  <g>
    <image preserveAspectRatio="none" x="0" y="0" width="100%" height="100%" xlink:href="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Bucephala-albeola-010.jpg/800px-Bucephala-albeola-010.jpg" id="clippy" clip-path="url(#hexagon)">
  </g>
</svg>
Run Code Online (Sandbox Code Playgroud)

Tho*_*s W 7

您可能希望使用滤镜效果在悬停时为图像提供一些颜色(请参阅Tinkerbin):

<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 100 100">
  <style type="text/css">
    image:hover {
      filter:url(#Matrix);
    }
  </style>
  <defs>
    <clipPath id="ellipse">
      <ellipse cx="50" cy="35.5" rx="49.5" ry="35" />
    </clipPath>
    <clipPath id="hexagon">
      <polygon points="25, 0  75, 0 100, 43.30127018922193 75, 86.60254037844386  25, 86.60254037844386  0, 43.30127018922193"/>
    </clipPath>
    <clipPath id="rectangle">
      <rect x="0" y="0" width="100" height="70"></rect>
    </clipPath>
    <filter id="Matrix" filterUnits="objectBoundingBox" 
            x="0%" y="0%" width="100%" height="100%">
      <feColorMatrix type="matrix" in="SourceGraphic"
           values="1 0 0 0 .5 
                   .1 .9 0 0 0 
                   .1 0 .9 0 0 
                   0 0 0 1 0"/>
    </filter>
  </defs>
  <g>
    <image preserveAspectRatio="none" x="0" y="0" width="100%" height="100%" xlink:href="http://upload.wikimedia.org/wikipedia/commons/thumb/b/bf/Bucephala-albeola-010.jpg/800px-Bucephala-albeola-010.jpg" id="clippy" clip-path="url(#hexagon)">
  </g>
</svg>
Run Code Online (Sandbox Code Playgroud)

编辑:有关过滤器的一些说明:

应用的滤镜会更改每个光栅像素的颜色.它采用其原始颜色值,将指定的矩阵应用于<feColorMatrix>颜色矢量,并且生成的颜色矢量成为显示的颜色.

矩阵如何工作?

矩阵由四行组成.第一行计算新的红色成分,第二行计算绿色,红色第三,第四行.

每行五个数字的含义是什么?第一个数字乘以原始颜色的红色分量,第二个数字乘以绿色,第三个蓝色,第四个alpha.总结了所有四个产品,并且还添加了行中的第五个值(作为不依赖于任何原始颜色分量的常量).

让我们看一下上面的例子:让我们假设我们有一个颜色值为灰色的像素

rgba(25%,25%,25%,1)
Run Code Online (Sandbox Code Playgroud)

产生的红色值会是什么?计算红色值的第一行是

1 0 0 0 .5
Run Code Online (Sandbox Code Playgroud)

我们计算如下:

  1*r   + 0*g   + 0*b   + 0*a + .5
= 1*.25 + 0*.25 + 0*.25 + 0*1 + .5 = .75
Run Code Online (Sandbox Code Playgroud)

这意味着,像素的最终红色分量为75%.其他组件类似地计算.

  • @ctrlaltdel:为了自动生成`feColorMatrix`的值,你实际上需要五个颜色对,每个颜色对由一个"原始"颜色和它由矩阵映射到的颜色组成.(至少那是我在相当累的时候所相信的.也许我应该在醒来时再考虑一下.)我编辑了这个问题,以包含更多关于矩阵的信息. (2认同)