20

请原谅我的无知,SVG 对我来说很新。我试图在我的内联 SVG 中的一组元素上获得悬停效果。每组元素都是一组紧密定位的圆圈。我可以用 css 实现这种悬停效果,但显然这只在鼠标位于一个圆圈上时才有效。我想要的是当鼠标在包含圆圈的整个区域上时起作用的效果,因此空间和圆圈结合在一起。

<style>
svg {
  height: 220px;
  width: 400px;
  background: grey;
}

.na circle,
.as circle {
  fill: white;
}

.na:hover circle {
  fill: blue;
}
</style>

<svg xmlns="http://www.w3.org/2000/svg" version="1.1">
  <g class="na">
    <circle cx="35%" cy="2.85%" r="2.8" />
    <circle cx="36.75%" cy="2.85%" r="2.8" />
    .
    .
    <circle cx="38.5%" cy="8.55%" r="2.8" />
    <circle cx="40.25%" cy="8.55%" r="2.8" />
  </g>    
</svg>

http://jsfiddle.net/c3EaX/

当您将鼠标移到一个组上时,当您在圆圈和它们之间的空间之间移动时,请查看悬停闪烁。

您将如何让鼠标悬停效果看起来覆盖该组所覆盖的整个区域?是否有可用于此的 SVG 元素?

4

5 回答 5

27

接受的答案对我不起作用。我找到了以下解决方案:

g {
  pointer-events: bounding-box;
  opacity: 0.4;
}
g:hover {
    opacity: 1;
}
于 2017-10-03T15:39:18.623 回答
11

你需要放一些东西来覆盖缺失的区域。

更简单的方法是这个:

.na circle,
.as circle {
    fill: white;
    stroke: transparent;
    stroke-width: 4px;
}

更新的小提琴

于 2013-10-08T18:10:19.913 回答
2

@vals 和 @M_Willett 的答案在 MacOs (High Sierra) 的 Firefox v60.0.2 中不起作用。我在用着:

g {
  pointer-events: bounding-box;
}

在 Chrome 中,它可以完美运行。也尝试了@vals 的答案,但这在 Firefox 中也不起作用。

于 2018-06-14T15:12:50.470 回答
1

另一个解决方案需要一点 JavaScript 才能以编程方式获取组的边界矩形。唯一的缺点是悬停效果将应用于该矩形而不是组的实际形状。

const group = document.getElementById('group');
const box = group.getBoundingClientRect();

document.addEventListener('mousemove', e => {
  const hover = e.clientX > box.left && e.clientX < box.right && e.clientY > box.top && e.clientY < box.bottom;
  if (hover) {
    group.classList.add('hovered');
  } else {
    group.classList.remove('hovered');
  }
});
body {
  background: gray;
}

g > circle {
  fill: white;
}

g.hovered > circle {
  fill: blue;
}
<svg>
  <g id="group">
    <circle cx="30%" cy="20%" r="5"></circle>
    <circle cx="60%" cy="20%" r="5"></circle>
    <circle cx="45%" cy="50%" r="5"></circle>
  </g>
</svg>

于 2019-07-14T23:35:17.607 回答
1

使用模式

对于解决方案,您可以使用pattern基于单个圆圈的。

在这种情况下,您不需要绘制很多圆圈来填充形状。

在填充 SVG 图案的图形时为圆形的克隆着色时会出现困难。

但是可以通过为图案内的圆圈着色来解决这个问题。

<animate attributeName="fill" values="white;dodgerblue" begin="path1.mouseover" dur="0.1s" fill="freeze" />

<style>
#ptn1 {
fill:dodgerblue;
}
</style>
<svg id="svg1" version="1.1" xmlns="http://www.w3.org/2000/svg" 
    xmlns:xlink="http://www.w3.org/1999/xlink"
	     width="200" height="200" viewBox="0 0 100 100" >  
<defs>
<pattern id="ptn1"   
  x="0" y="0" width="5" height="5"
  patternUnits="userSpaceOnUse">
<circle cx="3" cy="3" r="2" fill="none" stroke="grey" stroke-width="0.5" >
  <animate attributeName="fill" values="white;dodgerblue" begin="path1.mouseover" dur="0.3s" fill="freeze" />
   <animate attributeName="fill" values="dodgerblue;white" begin="path1.mouseout" dur="0.3s" fill="freeze" />
 </circle>
</pattern>
</defs>		 

<path id="path1" d="m10 50 v-5h5 v-5h5 v-5h5 v-5h5 v-5h5 v5h5 v5h5 v5h5 v5h5 v5h-45 "  stroke="none" fill="url(#ptn1)" />
</svg>

于 2019-07-15T15:11:19.437 回答