【问题标题】:Create Tooltip for SVG <image> tag为 SVG <image> 标签创建工具提示
【发布时间】:2019-11-25 06:21:46
【问题描述】:

我正在尝试创建一个工具提示,当用户将鼠标悬停在图标上时将显示该工具提示,该工具提示将提供有关该事件的信息。标记位于 SVG 图像中。

这是图片的代码:

<image  class="tooltip-trigger" data-tooltip-text="Battles" id="Battles" x="100" y="200" width="30" height="30" xlink:href="battle.png" />


<g id="tooltip" visibility="hidden" >
        <rect x="2" y="2" width="80" height="24" fill="black" opacity="0.4" rx="2" ry="2"/>
        <rect width="80" height="24" fill="white" rx="2" ry="2"/>
        <text x="3" y="6">Tooltip</text>
    </g>


<script type="text/ecmascript"><![CDATA[
    (function() {
        var svg = document.getElementById('tooltip-svg-5');
        var tooltip = svg.getElementById('tooltip');
        var tooltipText = tooltip.getElementsByTagName('text')[0].firstChild;
        var triggers = svg.getElementsByClassName('tooltip-trigger');
        for (var i = 0; i < triggers.length; i++) {
            triggers[i].addEventListener('mousemove', showTooltip);
            triggers[i].addEventListener('mouseout', hideTooltip);
        }
        function showTooltip(evt) {
            var CTM = svg.getScreenCTM();
            var x = (evt.clientX - CTM.e + 6) / CTM.a;
            var y = (evt.clientY - CTM.f + 20) / CTM.d;
            tooltip.setAttributeNS(null, "transform", "translate(" + x + " " + y + ")");
            tooltip.setAttributeNS(null, "visibility", "visible");
            tooltipText.data = evt.target.getAttributeNS(null, "data-tooltip-text");
        }
        function hideTooltip(evt) {
            tooltip.setAttributeNS(null, "visibility", "hidden");
        }
    })()
]]></script>

加载时,提示不出现

【问题讨论】:

  • 图像代码:工具提示

标签: image svg tooltip


【解决方案1】:

您的代码正在运行。您可能遇到的问题是工具提示主要出现在 svg 元素之外。我已将 overflow:visible; 添加到 svg 元素,现在您可以看到工具提示了。

  (function() {
        var svg = document.getElementById('tooltip-svg-5');
        var tooltip = svg.getElementById('tooltip');
        var tooltipText = tooltip.getElementsByTagName('text')[0].firstChild;
        var triggers = svg.getElementsByClassName('tooltip-trigger');
        for (var i = 0; i < triggers.length; i++) {
            triggers[i].addEventListener('mousemove', showTooltip);
            triggers[i].addEventListener('mouseout', hideTooltip);
        }
        function showTooltip(evt) {
            var CTM = svg.getScreenCTM();
            var x = (evt.clientX - CTM.e + 6) / CTM.a;
            var y = (evt.clientY - CTM.f + 20) / CTM.d;
            tooltip.setAttributeNS(null, "transform", "translate(" + x + " " + y + ")");
            tooltip.setAttributeNS(null, "visibility", "visible");
            tooltipText.data = evt.target.getAttributeNS(null, "data-tooltip-text");
        }
        function hideTooltip(evt) {
            tooltip.setAttributeNS(null, "visibility", "hidden");
        }
    })()
svg{border:1px solid; overflow:visible;display:block;margin:auto}
<svg id="tooltip-svg-5" viewBox="0 -8 130 238" width="200">

  <image class="tooltip-trigger" data-tooltip-text="Battles" id="Battles" x="100" y="200" width="30" height="30" xlink:href="https://s3-us-west-2.amazonaws.com/s.cdpn.io/222579/pin.png" /> 
  <g id="tooltip" visibility="hidden"> 
    <rect x="2" y="2" width="80" height="24" fill="black" opacity="0.4" rx="2" ry="2"/> 
    <rect width="80" height="24" fill="white" rx="2" ry="2"/> 
    <text x="3" y="6">Tooltip</text> 
  </g> 
</svg>

另一种选择是在文本中添加text-anchor="end" 并相应地重写矩形。

另一种药水会使用 HTML 元素作为工具提示。

【讨论】:

  • 工作就像一个魅力!另一个问题是,我希望工具提示文本出现在不同的行中,但是
    不起作用: data-tooltip-text=\""+id+"
    Location: "+location+"
    Result : "+result+" 有什么建议吗?
  • 你是对的。 &lt;br/&gt; 不适用于 svg &lt;text&gt;。您将需要使用&lt;tspan&gt;。请尝试以下操作:&lt;svg id="tooltip-svg-5" viewBox="0 -20 150 90" width="200"&gt; &lt;g id="tooltip"&gt; &lt;text x="3" y="6"&gt;27 &lt;tspan x="3" dy="19"&gt;Location: Barcelona&lt;/tspan&gt; &lt;tspan x="3" dy="19"&gt;Result: result&lt;/tspan&gt; &lt;/text&gt; &lt;/g&gt; &lt;/svg&gt;。如果这没有帮助,请提出不同的问题。
猜你喜欢
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 2015-07-16
  • 2018-08-08
  • 2010-09-11
  • 1970-01-01
  • 2021-11-25
  • 1970-01-01
相关资源
最近更新 更多