【问题标题】:styling a hover statement in SVG在 SVG 中设置悬停语句的样式
【发布时间】:2021-09-06 00:20:47
【问题描述】:

我正在计划一个基于此 SVG 插图的网络“菜单”: the principle of my idea; a circle styled as being active, a circle styled as hover and an accompanying stroke that also needs to be styled

当我阅读 SVG 文件的规范时,我无法使用 if-then 语句。

我正在努力解决如何解决连接两个圆圈的笔划的悬停样式。换句话说,当元素是 SVG 文件中的元素时,如何设置其样式

  1. 在触发元素之外

  1. 基于当前活跃页面/活跃圈子

如果能帮助我找到一种方法或替代方法,我将不胜感激。

谢谢。

【问题讨论】:

  • 如果一个编程任务看起来太复杂了;简化它。从 2 个圆圈开始,然后使用 JavaScript 在它们之间画一条线。
  • 你有没有使用一点 Javascript 进行调查?

标签: css if-statement svg hover


【解决方案1】:

这可以相当简单地完成。但它需要一点 javascript。

这是一个只有三个圆圈的简化示例。希望如何添加其他两个圆圈和其余线条应该很明显。 JS 和 CSS 应该适用于任意数量的圆和线。

window.addEventListener('DOMContentLoaded', (event) => {

    var  allCircles = document.querySelectorAll("circle");

    // Add an click handler to every circle that
    // adds the class "active" to the clicked circle.
    allCircles.forEach(element => {
        element.addEventListener("click", clickHandler);
        element.addEventListener("mouseover", mouseoverHandler);
        element.addEventListener("mouseout", mouseoutHandler);
    });
    
});


function  clickHandler(evt) {
    // Clear current selection (remove class "active" from any circle)
    allCircles.forEach((circle) => circle.classList.remove("active"));
    // Mark clicked circle selected
    evt.target.classList.add("active");
    // Clear any currently highlighted lines
    clearHighlightedLines();
}


function  mouseoverHandler(evt) {
    let activeCircle = document.querySelector("circle.active");
    let hoveredCircle = evt.target;
    if (activeCircle && (activeCircle != hoveredCircle)) {
        // Get the line that has classes matching both the actibve and hovered circle
        let line = document.querySelector("line."+activeCircle.id+"."+hoveredCircle.id);
        // Add the class "highlight" to that line
        if (line)
            line.classList.add("highlight");
    }
}


function  mouseoutHandler(evt) {
    clearHighlightedLines();
}


function  clearHighlightedLines() {
    // Find the line with class "highlight" (if any)
    var line = document.querySelector("line.highlight");
    // Remove the class "highlight"
    if (line)
        line.classList.remove("highlight");
}
#c3 {
  fill: maroon;
}

#c4 {
  fill: steelblue;
}

#c5 {
  fill: rebeccapurple;
}

circle:hover:not(.active) {
  stroke: #999;
  stroke-width: 1.5;
}

circle.active {
  stroke: black;
  stroke-width: 1.5;
}

line {
  stroke: gold;
  stroke-width: 1;
}

line.highlight {
  stroke: black;
}
<svg viewBox="0 0 100 100">

  
  <!-- line from c3 to c4 -->
  <line x1="75" y1="40" x2="25" y2="70" class="c3 c4"/>

  <!-- line from c3 to c5 -->
  <line x1="75" y1="40" x2="57" y2="70" class="c3 c5"/>

  <!-- line from c4 to c5 -->
  <line x1="25" y1="70" x2="57" y2="70" class="c4 c5"/>


  <circle id="c3" cx="75" cy="40" r="10"/>

  <circle id="c4" cx="25" cy="70" r="10"/>

  <circle id="c5" cx="57" cy="70" r="10"/>

</svg>

【讨论】:

  • 谢谢你,波尔。这是我第一次在这里提出问题,我真的认为这是一个很长的问题。但你做到了——太棒了——我很高兴。
  • 我基本上想知道为什么这个答案/解决方案可以在这个页面上运行,但在复制到带有外部 javascript 文件链接的 HTML 文件时却不能。似乎是 javascript 没有发挥它的魔力,我已经读过当代码位于 SVG 文件中时,脚本不会被解析到浏览器。我尝试了不同的方式来加载它 - 但没有任何效果。有任何想法吗?什么是有效的,直到圆圈用灰色边框突出显示。当我按下状态不会变为黑色边框。其余的也不起作用......
  • Javascript 的第一部分(函数之前的位)需要在 DOM 准备好后运行。我已经更新了我的答案以展示如何做到这一点。
  • 对不起。我一定是忘记保存了。现已修复。
  • 嗨@PaulLeBeau。我对clickHandler 有一些问题,因为没有添加 .active 类 - 请参阅我的另一个问题:link。这里添加了活动类,但在我的测试站点上使用相同的脚本和相同的 SVG 并没有得到相同的结果。我得到的反馈是它之所以有效,是因为所有链接都是 href="#0"。测试站点上的链接未确定正确,并且所选圆圈没有获得“活动”类,因为它应该在新页面加载时获得。
猜你喜欢
  • 2017-04-03
  • 2018-05-22
  • 1970-01-01
  • 2016-12-25
  • 2020-11-10
  • 2016-04-27
  • 2016-05-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多