【问题标题】:SVG hover state on multiple layers, not only top layerSVG 在多个图层上的悬停状态,不仅是顶层
【发布时间】:2019-03-04 17:16:15
【问题描述】:

我想将决策树显示为具有一些交互性的 SVG。不同的路径都在那里,悬停时它们的不透明度增加了。但是悬停状态似乎只适用于顶部元素。

#flow polyline {
  stroke: #0071bc;
  stroke-opacity: 0;
  stroke-width: 8px;

  mix-blend-mode: color;
}
#flow polyline:hover {
  stroke-opacity: 1;
}

https://jsfiddle.net/yv82f3ud/

如何将悬停事件应用于所有悬停的 svg 折线,而不仅仅是顶层?


后续问题: 有没有办法让应用悬停状态的路径更宽,这样我就不必完全越过这条线?

【问题讨论】:

    标签: css svg hover polyline


    【解决方案1】:

    如何将悬停事件应用于所有悬停的 svg 折线,而不仅仅是顶层?

    没有简单的方法。您需要检测您结束了哪个部分,确定应该突出显示哪些部分,然后自己手动突出显示它们。

    有没有办法让应用悬停状态的路径更宽,这样我就不必完全越界?

    是的,使用单独的透明粗线

    .line {
      stroke: grey;
      stroke-width: 2;
    }
    
    .line-wider {
      stroke: transparent;
      stroke-width: 40;
    }
    
    g:hover .line {
      stroke: blue;
    }
    <svg>
      <g>
        <path d="M0,50 L 300,50" class="line"/>
      </g>
      <g>
        <path d="M0,100 L 300,100" class="line"/>
        <path d="M0,100 L 300,100" class="line-wider"/>
      </g>
    </svg>

    您可以在粗透明线部分上使用鼠标悬停事件来确定您所在的部分,并据此进行突出显示。

    类似于以下内容:

    // Add event listener to each "line-wider" path, that highlights the sections
    var sections = document.querySelectorAll(".line-wider");
    sections.forEach(function(elem) {
      elem.addEventListener("mouseover", doHover);
      elem.addEventListener("mouseout", clearHover);
    });
    
    
    var highlightedSections = {
      's1':   '.s1, .s11, .s12, .s111, .s112, .s121, .s122',
      's11':  '.s1, .s11, .s111, .s112',
      's12':  '.s1, .s12, .s121, .s122',
      's111': '.s1, .s11, .s111',
      's112': '.s1, .s11, .s112',
      's121': '.s1, .s12, .s121',
      's122': '.s1, .s12, .s122'
    };
    
    function doHover(evt) {
      // Which section are we hovering over?
      var id = evt.target.id;
      // highlightedSections[id] is a CSS selector which selects all the sections which should be highlighted for this hover section
      document.querySelectorAll(highlightedSections[id]).forEach( function(elem) {
        // Add the "highlight" class to all the matching sections
        elem.classList.add("highlight");
      });
    }
    
    
    // Remove the "highlight" class from all elements which currently have it set
    function clearHover(evt) {
      document.querySelectorAll(".highlight").forEach( function(elem) {
        elem.classList.remove("highlight");
      });
    }
    .line {
      fill: none;
      stroke: grey;
      stroke-width: 2;
    }
    
    .line-wider {
      fill: none;
      stroke: transparent;
      stroke-width: 40;
    }
    
    .highlight {
      stroke: blue;
    }
    <svg width="400" height="500">
      <!-- top section -->
      <path d="M 200,0 L 200,100" class="line s1"/>
      <path d="M 200,0 L 200,100" class="line-wider" id="s1"/>
    
        <!-- left branch -->
        <path d="M 200,100 L 100,200, 100,300" class="line s11"/>
        <path d="M 200,100 L 100,200, 100,300" class="line-wider" id="s11"/>
    
          <!-- left branch -->
          <path d="M 100,300 L 50,350, 50,450" class="line s111"/>
          <path d="M 100,300 L 50,350, 50,450" class="line-wider" id="s111"/>
          <!-- right branch -->
          <path d="M 100,300 L 150,350, 150,450" class="line s112"/>
          <path d="M 100,300 L 150,350, 150,450" class="line-wider" id="s112"/>
    
        <!-- right branch -->
        <path d="M 200,100 L 300,200, 300,300" class="line s12"/>
        <path d="M 200,100 L 300,200, 300,300" class="line-wider" id="s12"/>
    
          <!-- left branch -->
          <path d="M 300,300 L 250,350, 250,450" class="line s121"/>
          <path d="M 300,300 L 250,350, 250,450" class="line-wider" id="s121"/>
          <!-- right branch -->
          <path d="M 300,300 L 350,350, 350,450" class="line s122"/>
          <path d="M 300,300 L 350,350, 350,450" class="line-wider" id="s122"/>
    
    </svg>

    【讨论】:

      猜你喜欢
      • 2019-10-06
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-15
      相关资源
      最近更新 更多