【问题标题】:Tooltip to display in two separate lines not working in Firefox在 Firefox 中不起作用的两行显示的工具提示
【发布时间】:2014-05-13 08:38:59
【问题描述】:

我正在添加带有<br> html 标记的工具提示。它在 chrome 上运行良好,但在 Firefox 上却不行。

我的代码:

var dot = svg.append("g")
      .attr("class", "dots")
      .selectAll(".dot")
      .data(interpolateData(1))
      .enter().append("circle")
      .attr("class", "dot")

  // Add a title.
  dot.append("title")
     .each(function() {


      var d = d3.select(this);
d3.select(this).select("title")
       .html(function(d,i) { return d.name + ": " + Math.round(Number(d.avg)) + " avg each month <br>" + d.name + ": Build of "  + Math.round(Number(d.Checkin)) + " hrs each month";});

工具提示应该显示在 2 行中。它在 chrome 中可以正常工作,但在 Firefox 中则不行。

【问题讨论】:

  • 您是使用 HTML 还是 SVG 来呈现工具提示?
  • 我正在使用 svg 并附加标题
  • 编辑了代码以显示我如何附加 svg。

标签: d3.js


【解决方案1】:

SVG &lt;title&gt; 元素在浏览器之间的处理方式不一致,因为它与 HTML 的 title 属性相比具有相似的功能但不同的规则。浏览器似乎会选择性地选择将哪些 HTML 规则应用于 SVG 以及如何应用。

SVG &lt;title&gt; element specs 表示:

  • 标题主要是为了便于访问。

  • 浏览器可能将标题显示为工具提示。

  • 必须显示独立 SVG 文档中的 顶级标题(通常在标题栏中,与 HTML &lt;title&gt; 元素相同)。

  • 标题可能包含来自其他命名空间的内容,具有适当的 XML 命名空间属性,但没有说明在创建工具提示时应该如何呈现这些内容。

  • 任何不在另一个命名空间中的内容大概都应该服从一般的SVG whitespace-handling rules,这需要忽略换行

HTML title attribute specs 表示:

  • 标题表示有关元素的附加“建议信息”。

  • 浏览器必须向用户提供标题信息,最好以独立于设备的方式(尽管大多数只在悬停时显示)。

  • 在显示工具提示时必须遵守属性中的换行符。

  • 不允许使用其他标记(因为它是属性,而不是 HTML 代码)。

但是……

浏览器制造商重复使用显示 HTML 工具提示的代码来显示 SVG 工具提示,因此事情变得混乱。

跟随这个小提琴(记住这适用于 HTML 文档中的内联 SVG):http://fiddle.jshell.net/5npxba9L/6/

  • SVG &lt;title&gt; 中的硬换行符和额外空格:

    • 在 Chrome 36、Opera 24 和 Firefox 31 中保留(即应用 HTML 属性规则)

    • 在 IE 11 中被忽略(即应用 SVG 空白规则)

  • 在 SVG &lt;title&gt; 中标记 &lt;br/&gt; 元素:

    • 从 Firefox 31 的工具提示中删除

    • 在 Chrome 36、Opera 24 和 IE 11 中显示为换行符

    • 在使用 XML 命名空间前缀时,在所有浏览器中都会被完全忽略(这在 XHTML 文档中可能会有所不同)

  • SVG &lt;title&gt; 中的其他标记元素,例如 SVG &lt;tspan&gt; 元素:

    • 从 Firefox 31 和 IE 11 的工具提示中删除

    • 在 Chrome 和 Opera 中显示为纯文本(即打印出尖括号)

  • 在所有经过测试的浏览器中(正确)

  • ,HTML 标题属性中保留了硬换行符和额外的空格,并且额外的标记呈现为纯文本

所以,完全不符合规范的方法是使用 both &lt;br/&gt; 标签(un-命名空间或更改默认命名空间)和&lt;title&gt; 元素中的硬换行符:

<svg>
    <circle cx="250" r="50">
        <title><span xmlns="http://www.w3.org/1999/xhtml">Title with <br/>
a line break</span></title>
    </circle>
</svg>

适用于当前版本的 Chrome、Opera、Firefox 和 IE(尚未在 Safari 或移动设备中测试),尽管基于 webkit 的浏览器会创建一个额外的空白行。

但是请注意:在大多数浏览器中,您将无法使用 d3 selection.html() 方法创建上述标记,因为该函数依赖于未在 SVG 元素上定义的 HTMLElement.innerHTML DOM 属性.您需要分别创建文本节点和 &lt;br&gt; 元素。最简单的方法是使用虚拟 HTML 元素作为父元素,使用 innerHTML 属性创建混合内容,然后将其附加到标题元素:

dot.enter().append("circle")
      .attr("class", "dot")
      .attr("r", "50")
      .attr("cx", function(d,i){return i*100 + 50;})
  .append("title")
  .append(function(d, i){
      //when the parameter to `append()` is a function
      //it will be run for each element in the active selection
      //(in this case, the title elements)
      //and must return the actual element node to append.

      var span = document.createElement("span");
      span.innerHTML = "This is element <br/>\n #" + i;
      //the \n will be converted in Javascript to a line break
      return span;
  });

http://fiddle.jshell.net/cLLsgdmk/

这主要是出于好奇。如果您想要更可靠的解决方案,请按照 Lars 的回答获取如何创建 &lt;foreignObject&gt; 工具提示的链接,或查看 this Codepen demo 了解有关如何使用 Javascript 在您的顶部覆盖绝对定位的 &lt;div&gt; 的信息SVG。

【讨论】:

  • 感谢 AmeliaBR,这提供了一个很好的概述,并且由于我在服务器生成的 SVG 上进行浏览器检测,因此在我的目标(IE11 和 FF)中都可以使用,如果有点hacky。
【解决方案2】:

您使用的&lt;br&gt; 标签在 SVG 中没有任何意义——Chrome 以您想要的方式解释它的事实违反了标准。要在 SVG 中获取多行文本,基本上有两种选择:

  • 使用多个texttspan 元素。
  • 使用 foreignObject 嵌入 HTML 并使用例如&lt;br&gt; 那里。

this question 中的一些更多信息和指针。

编辑:这些选项不适用于title 元素(感谢 AmeliaBR 指出)。

【讨论】:

  • 我尝试像这样添加:dot.append("foreignObject") .attr("width", 480) .attr("height", 500) .append("xhtml:title") 。 style("font", "14px 'Helvetica'") .html("Tooltip");然而,这是添加一个新的 forgeinobject 标签,但标题没有显示在点上。
  • HTML 中没有title 元素,而是附加一个body。参见例如here.
  • 我尝试附加正文。这是每个圆圈的样子:工具提示
    ToolTip1
    但是工具提示没有显示
  • 您不能将内容附加到circle 元素。附加到 g 元素或顶级 SVG。
  • 我尝试了以下但仍然无法正常工作 dot.append("foreignObject") .each(function() { //var d = d3.select(this); dot.attr("width" , 480) dot.attr("height", 500) dot.append("g") dot.style("font", "14px 'Helvetica'") dot.html("Tooltip
    ToolTip1");
猜你喜欢
  • 2010-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多