在 Firefox 中无法以两行显示的工具提示

2024-01-15

我正在添加一个工具提示<br>html 的标签。它在 chrome 中运行良好,但在 firefox 中运行不佳。

My code:

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 中不行。


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

The SVG <title>元件规格 http://www.w3.org/TR/SVG11/struct.html#DescriptionAndTitleElements表明:

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

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

  • The 顶级标题但是,必须在独立的 SVG 文档中显示(通常在标题栏中,与 HTML 相同)<title>元素)。

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

  • 任何不在其他命名空间中的内容大概都应该受到一般的约束SVG 空白处理规则 http://www.w3.org/TR/SVG11/text.html#WhiteSpace,这需要换行符ignored.

The HTML title属性规格 http://www.w3.org/html/wg/drafts/html/CR/dom.html#the-title-attribute表明:

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

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

  • 显示工具提示时必须考虑属性内的换行符。

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

But...

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

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

  • SVG 中的硬换行符和额外空白<title>:

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

    • are ignored在 IE 11 中(即应用 SVG 空白规则)

  • Markup <br/>SVG 中的元素<title>:

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

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

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

  • SVG 中的其他标记元素<title>,例如 SVG<tspan>要素:

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

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

  • 在所有测试的浏览器中(正确),硬换行符和额外的空格保留在 HTML 标题属性中,并且额外的标记呈现为纯文本

So, the 完全hacky并且不符合规格在内联 SVG 中获取多行工具提示的方法是使用both <br/>标签(未命名空间或默认命名空间发生更改)和硬换行符<title>元素:

<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()大多数浏览器中的方法,因为该函数依赖于HTMLElement.innerHTMLDOM 属性,未在 SVG 元素上定义。您需要创建文本节点和<br>元素分开。最简单的方法是使用虚拟 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/ http://fiddle.jshell.net/cLLsgdmk/

这主要是出于好奇。如果您想要更可靠的解决方案,请按照 Lars 的回答获取有关如何创建<foreignObject>工具提示,或查看这个 Codepen 演示 http://codepen.io/AmeliaBR/pen/kFDvH有关如何使用 Javascript 覆盖绝对定位的信息<div>在你的 SVG 之上。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Firefox 中无法以两行显示的工具提示 的相关文章

  • 如何避免多系列折线图d3.js的工具提示重叠

    我已经在多系列折线图上创建了工具提示 如下所示在这里回答 https stackoverflow com questions 34886070 d3 js multiseries line chart with mouseover tool
  • c3js数据标签的位置

    有没有可能的方法来更改数据上方标签的位置c3条形图 在官方文档中 很好地解释了如何通过操作 y 和 x 整数来更改 x 和 y 测量轴上标签的位置 但我没有找到任何数据标签 我试图用简单的方式指出它d3其上c3是基于但是console lo
  • 使用 d3-geo-projection 命令行工具设置自定义投影

    我正在尝试使用 geoproject 在 geojson 文件上设置投影 具体来说 我正在尝试将投影设置为 BCalbers http spatialreference org ref epsg 3005 http spatialrefer
  • D3更新circle-pack数据新节点与现有节点重叠

    我正在关注一般更新模式 http bl ocks org mbostock 3808234但在分层方面存在问题 使用圆形包装布局 我pack新数据 update enter and exit圆形元素 然而 当新元素enter 它们重叠upd
  • 为什么我的 D3 SVG 图上的轴不会更新?

    I have 简单的 D3 散点图 http www raxacoricofallapatorius com test scattertest html我在显示数据的几个不同属性之间切换 但是虽然我可以更改数据点 并按照我想要的方式进行转换
  • 使用什么比例仅在 d3 js 中的 x 轴上表示年份

    我一直在 D3 Js 中开发年份 x 轴 与收入 y 轴 的面积图 数据如下 localData Revenue 4 5 Year 2011 Revenue 5 5 Year 2010 Revenue 7 0 Year 2012 Reven
  • 使 D3 响应式:viewBox 与 resize()?

    我必须构建在平板电脑 桌面显示器以及某些情况下非常大的 4k 高分辨率影院尺寸显示器上都能正常运行的 d3 可视化效果 因此 我试图找出使用 SVG 的 viewBox 属性和 preserveaspectratio 与调用调整大小函数以在
  • 如何从此 d3.js layout.tree 获取树祖先和树后代的列表?

    我正在尝试和修改this https bl ocks org mbostock 4339083d3 js 的示例 用于根据 JSON 树结构绘制树 这就是树的一部分开始时的样子 我正在尝试进行两个单独的修改 但我不知道该怎么做 当单击节点的
  • D3 js 链接在节点下面

    我创建了图形对象 稍后可以使用更多节点和链接来扩展图形对象 第一个创作看起来不错 然后 与add函数我添加了节点 4 和链接 as you can see above the link of between node 4 and 3 is
  • Dimple.js - 将数据标签添加到条形图的每个条形

    我使用的是dimple js 它基于d3 js 是否可以向本示例中提到的条形图的每个条形添加数据标签http dimplejs org examples viewer html id bars vertical http dimplejs
  • d3 饼图中的文本被路径覆盖

    我正在尝试按照 d3 的饼图示例进行操作http bl ocks org mbostock 3887235 http bl ocks org mbostock 3887235 我的代码的最小示例 const container graph
  • 赋予 d3 序数轴标签与尺度名称不同

    我有一个序数scale具有不同值的某些标签 我想显示该比例的轴 其中轴标签与比例标签不同 我有这个代码 var width 1000 var height 600 var margins left 100 40 right 25 botto
  • D3 删除千位的逗号分隔符

    我有一个包含 3 列的 json 其中一列是 年份 该列仅包含年份 没有日期 当我在 x 轴上绘制它时 年份会以逗号分隔符表示数千 所以在 json 中 日期的格式是 Year 1990 在 x 轴上 结果是 1 990 我一直在试图弄清楚
  • LeafletJs只显示一个国家

    我使用 Leafletjs 和 D3 来显示地图 我只想在地图上显示英国 Leaflet和D3是否可以只显示英国 这当然是可能的 现在的解决方案取决于您是想使用 D3 绘制英国 还是想从 Tile Server 获取它 在后一种情况下 有一
  • D3js:如何设计地形图?

    给定具有高程数据的 GIS 栅格 如何在D3js中设计地形图 有没有使用 D3js 制作的耕地地形图 地形图的示例 不工作 我探索了以下可能性 tif gt gdal contour py gt shp gt topojson gt d3j
  • JS / d3.js:突出显示相邻链接的步骤

    再会 我之前对该项目的问题是 D3 js 根据相同的 json 值动态生成源和目标 https stackoverflow com questions 41138515 d3 js dynamically generate source a
  • d3.js:tickformat - 添加 % 符号而不乘以 100

    我的数据有百分比 例如 10 1 3 2 5 4 d3 format 0f 会给我 10 3 5 d3 format 0 会给我 1010 320 540 乘以 100 如何得到 10 3 5 我不知道在哪里添加 到第一种情况 或者在第二种
  • 如何使用 d3.js 沿 GeoJSON 路径对对象进行动画处理?

    我正在使用 D3 js 从 GeoJSON 文件生成并渲染路径 效果很好 但现在我想沿着该路径为对象设置动画 我知道如何使用 D3 和标准 SVG 来做到这一点 创建过渡并设置其持续时间 对于过渡的每一帧 使用 Complete 查找沿路径
  • 使用 Meteor 中的 D3 访问 csv 文件

    我已经使用 D3 成功渲染了一个 HTML 表格 显示了 csv 文件中的数据 但是当我将相同的代码移入 Meteor 项目时 我遇到了问题 传递到 d3 csv 回调中的数据对象一次拾取 HTML 文件 1 行 而不是 csv 数据 仅当
  • 窗口调整大小事件上的响应式画布

    我是画布概念的新手 我正在尝试使用 D3 js 绘制画布 我想让画布根据窗口屏幕大小进行响应 function onResize var element document getElementsByTagName canvas 0 var

随机推荐