【问题标题】:SVG onhover event on sides of polygon多边形两侧的 SVG 悬停事件
【发布时间】:2018-05-18 20:24:29
【问题描述】:

我使用 SVG 多边形创建了一个六边形。现在,我想在六边形的侧面附加悬停事件。下面是我创建 SVG 元素的方法。

<svg width="500" height="500" id="svgTry">
<polygon id="polySvg" points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" fill="transparent" stroke="rgb(249, 249, 249)" stroke-width="20" />
</svg>

我试过了

$('#polySvg').on("mouseenter",function(){
this.style['stroke-width'] = 20;
console.log("clicked");
});
$('#polySvg').on("mouseleave",function(){
this.style['stroke-width'] = 30;
console.log("clicked");
});

这是针对整个多边形的。我们可以在六边形的每一边创建相同类型的悬停事件吗?

【问题讨论】:

    标签: html svg


    【解决方案1】:

    您需要将多边形重新创建为六个独立的边。或者,更准确地说,是十二个独立的边,因为有两种不同的笔画宽度。您可能希望它们是梯形的,以说明它们连接处的斜角。

    这是假设您不想添加代码来计算最接近的多边形的大小,并相应地修改 SVG。这是很多不必要的工作。

    更新

    有几种方法可以做你想做的事。这是一种可能更简单的方法:

    1. 我们为六个边中的每一个创建一个三角形剪切路径。

      下面是应用了剪辑路径的六边形。红色三角形显示剪辑路径的位置。

    <svg width="500" height="500" id="svgTry">
    
      <defs>
        <clipPath id="cp1">
          <polygon points="150,150, 150,0, 285,75"/>
        </clipPath>
      </defs>
    
      <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0"
               fill="transparent" stroke="rgb(49, 249, 249)" stroke-width="20"
               clip-path="url(#cp1)"/>
    
      <polygon points="150,150, 150,0, 285,75" fill="red" opacity="0.2"/>
    
    </svg>
    1. 现在,如果我们再创建五个剪切路径 - 一个与其他五个边中的每一个匹配。我们再添加五个六边形副本,每个副本都应用了一个新的剪辑路径。

    <svg width="500" height="500" id="svgTry">
    
      <defs>
        <clipPath id="cp1">
          <polygon points="150,150, 150,0, 285,75"/>
        </clipPath>
        <clipPath id="cp2">
          <polygon points="150,150, 285,75, 285,225"/>
        </clipPath>
        <clipPath id="cp3">
          <polygon points="150,150, 285,225, 150,300"/>
        </clipPath>
        <clipPath id="cp4">
          <polygon points="150,150, 150,300, 15,225"/>
        </clipPath>
        <clipPath id="cp5">
          <polygon points="150,150, 15,225, 15,75"/>
        </clipPath>
        <clipPath id="cp6">
          <polygon points="150,150, 15,75, 150,0"/>
        </clipPath>
      </defs>
    
      <g id="sides" fill="transparent" stroke="rgb(49, 249, 249)" stroke-width="20">
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp1)"/>
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp2)"/>
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp3)"/>
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp4)"/>
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp5)"/>
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp6)"/>
      </g>
    
    </svg>
    1. 我们现在又得到了一个六角形。但是可以使用悬停规则来定位每个边以更改其笔划宽度。

    #sides polygon:hover {
      stroke-width: 40;
    }
    <svg width="500" height="500" id="svgTry">
    
      <defs>
        <clipPath id="cp1">
          <polygon points="150,150, 150,0, 285,75"/>
        </clipPath>
        <clipPath id="cp2">
          <polygon points="150,150, 285,75, 285,225"/>
        </clipPath>
        <clipPath id="cp3">
          <polygon points="150,150, 285,225, 150,300"/>
        </clipPath>
        <clipPath id="cp4">
          <polygon points="150,150, 150,300, 15,225"/>
        </clipPath>
        <clipPath id="cp5">
          <polygon points="150,150, 15,225, 15,75"/>
        </clipPath>
        <clipPath id="cp6">
          <polygon points="150,150, 15,75, 150,0"/>
        </clipPath>
      </defs>
    
      <g id="sides" fill="transparent" stroke="rgb(49, 249, 249)" stroke-width="20">
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp1)"/>
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp2)"/>
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp3)"/>
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp4)"/>
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp5)"/>
        <polygon points="150,0 285,75 285,225 150,300 15,225 15,75 150,0" clip-path="url(#cp6)"/>
      </g>
    
    </svg>

    这接近你想要的吗?

    请注意,为简单起见,我使用与六边形相同的坐标构建了剪辑路径。然而,这意味着笔画的外半部分被剪掉了。所以我们只看到了一半。这就是为什么当您悬停时,笔触只会在内部变粗。如果你想解决这个问题,你需要更新剪辑三角形,使它们稍微超出六边形的外侧。

    【讨论】:

    • 我现在正在尝试使用 6 条路径创建六边形。它不像多边形那样清晰。它在每条路径之间产生差距,我不知道如何填补它们之间的差距。对于 Ex;- &lt;path d="M150,0L285,75C" style="stroke:rgb(255,0,0);stroke-width:20" &gt;&lt;/path&gt; &lt;path d="M285,75L285,225" style="stroke:rgb(255,0,0);stroke-width:20" &gt;&lt;/path&gt; 这会在 2 条路径之间创建一个三角形间隙。
    • 你能帮帮我吗?
    • 你不能用线条来做到这一点。这就是为什么我说你必须为你的每一边创建一个填充的trapezoid 形状。
    猜你喜欢
    • 2013-04-07
    • 2015-07-09
    • 2020-07-11
    • 2019-10-27
    • 2023-04-02
    • 2016-07-08
    • 2016-11-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多