代码之家  ›  专栏  ›  技术社区  ›  Sacha

将svg工具提示的悬停区域扩展到其父元素的边界之外

  •  4
  • Sacha  · 技术社区  · 7 年前

    我有一个图表svg,它包含一些附加了工具提示的元素。工具提示是使用 foreignObject 在这些元素上悬停时应该会显示出来。我给了SVG overflow: visible 以确保工具提示可以完全显示。

    这很好,但问题是,只要光标离开外部svg的边界,工具提示就会消失:

    SVG tooltip

    (SVG结束于底轴的正下方)

    有没有办法“扩展”悬停区域以包含像这样突出svg的任何元素?

    2 回复  |  直到 7 年前
        1
  •  0
  •   Sacha    7 年前

    我得到的一个解决方案是给svg一个大的100px透明的 border-bottom background-clip: padding-box (尽管在我的案例中,第二部分甚至都没有必要)。

    它并不完美,因为它依赖于固定的边框宽度,如果工具提示高于此宽度,它将断开,但它确实扩展了悬停区域,因此它是一个选项。

        2
  •  0
  •   enxaneta    7 年前

    这是一个如何将svg之外的元素作为工具提示的示例:

    let mouse = {};
    let tooltip = document.querySelector("#tooltip");
    svg.addEventListener("mousemove", e => {
      tooltip.innerHTML = "";
      if (e.target.tagName == "circle") {
        mouse = oMousePos(svg, e);
       
        tooltip.innerHTML = e.target.id;
        tooltip.style.left = mouse.x + "px";
        tooltip.style.top = mouse.y + "px";
      }
    });
    
    function oMousePos(svg, evt) {
      var ClientRect = svg.getBoundingClientRect();
      return {
        //objeto
        x: Math.round(evt.clientX - ClientRect.left),
        y: Math.round(evt.clientY - ClientRect.top)
      };
    }
    svg{border:1px solid;}
    circle{fill:gold;}
    #tooltip{position:absolute;padding:1em; }
    <article>
    <svg id="svg" viewBox="0 0 100 50">
     <circle id="c1" cx="56" cy="17" r="15" />
     <circle id="c2" cx="23" cy="34" r="7" />
    </svg>
    
    <div id="tooltip"></div>
    </article>