【问题标题】:nvd3.js tooltip position with multiple chartsnvd3.js 带有多个图表的工具提示位置
【发布时间】:2015-04-10 22:46:18
【问题描述】:

我正在使用 v1.7.1 的 nvd3。我有一个页面,我在其中呈现具有相同配置但不同数据的图表行。我在多折线图上使用交互式工具提示选项。工具提示正在正确呈现,但是当您向下滚动页面时,当您滚动线时,工具提示将呈现在页面顶部的相同位置。前几行似乎将工具提示呈现在适当的位置,但是当您向下滚动时,工具提示就会消失。我尝试使用 tooltipContent (似乎是可用的 api)来操纵位置,但这不起作用。如下所示:

var chartOffset = $(id + ' svg').offset(),
        x = chartOffset.left,
        y = chartOffset.top;
      //chart.tooltip.position({"top":top,"left":left});
      //chart.interactiveLayer.tooltip.fixedTop(null);
     chart.tooltipContent(function (key, x, y, e) {
        if (e.value >= 0) {
          return '<h3>' + key + '</h3>' +
            '<p>' + y + ' at ' + x + '</p>';
        } else {
          return '';
        }
      });

我也尝试过设置 .nvtooltip 边距的样式,但没有看到修复。

下图显示了工具提示如何与您正在移动的线非常脱节

有解决此问题的提示吗?

这里是完整的 nvd3 图表选项:

var chart = nv.models.lineChart()
        .height(height)
        .width(width)
        .forceY([0, 1])
        .x(function (d) {
          return new Date(d[0]);
        })
        .y(function (d) {
          return d[1];
        })
        .color(chartcolors)
        .useInteractiveGuideline(true)
        .tooltips(true);

      chart.xAxis
        .axisLabel("")
        .tickFormat(function (d) {
          return d3.time.format('%x')(new Date(d))
        });

      chart.yAxis
        .axisLabel(yaxisLabel)
        .tickFormat(d3.format(',.1%'));

      chart.showLegend(true);

      var chartOffset = $(id + ' svg').offset(),
        x = chartOffset.left,
        y = chartOffset.top;

     chart.tooltipContent(function (key, x, y, e) {
        if (e.value >= 0) {
          return '<h3>' + key + '</h3>' +
            '<p>' + y + ' at ' + x + '</p>';
        } else {
          return '';
        }
      });

【问题讨论】:

    标签: d3.js nvd3.js


    【解决方案1】:

    我今天在 1.8.6-dev 中发现了一个类似的错误,并通过更改此块将 window.scrollY 添加到第 742 行的顶部来修复它:

        var positionTooltip = function() {
        nv.dom.read(function() {
            var pos = position(),
                gravityOffset = calcGravityOffset(pos),
                left = pos.left + gravityOffset.left,
                top = pos.top + gravityOffset.top;
    

    收件人:

        var positionTooltip = function() {
        nv.dom.read(function() {
            var pos = position(),
                gravityOffset = calcGravityOffset(pos),
                left = pos.left + gravityOffset.left,
                top = pos.top + gravityOffset.top+window.scrollY;
    

    在这种情况下,与其说存在多个图表的错误,不如说存在与滚动有关的错误,这通常在一个页面有多个图表时隐含。

    【讨论】:

    • 哇,这是一个大错误!为我解决了问题!您是否提交了拉取请求?
    • 当时我对 Git 不是很熟悉,但是其他人熟悉。我最近收到一封电子邮件,声称合并了拉取请求,所以我认为该错误现在已在最新版本上修复。
    • 我有同样的问题,你的解决方案适用于 chrome 和 edge,但对于 IE,它现在总是在左上角显示工具提示。您对此有解决方案吗?谢谢
    • @Katz 我会尝试在图表周围包裹一个额外的 DIV 标签并将其设置为 position:relative;看看是否能解决它。这听起来像工具提示,我假设它使用 CSS position: absolute;由于没有将直接父级设置为相对,因此变得相对于页面容器或视口。
    • @Katz 我尝试了我的建议,但没有奏效。我怀疑IE11没有解决方案。由于某种特定于 IE 的限制,很可能没有合理可行的方法来解决这个问题。
    【解决方案2】:

    我通过将默认重力更改为“s”解决了我的问题。我不知道如何将其设置为选项,所以我只是更改了 nvd3 代码。我很想将其更改为一个选项,但文档并不清楚。

    【讨论】:

      【解决方案3】:

      我遇到了类似的问题。 nvd3 的原生 showTooltip 方法的当前实现如下所示:

      var showTooltip = function(e, offsetElement) {
        var left = e.pos[0] + ( offsetElement.offsetLeft || 0),
          top = e.pos[1] + ( offsetElement.offsetTop || 0),
          x = xAxis.tickFormat()(multibar.x()(e.point, e.pointIndex)),
          y = yAxis.tickFormat()(multibar.y()(e.point, e.pointIndex)),
          content = tooltip(e.series.key, x, y, e, chart);
      
        nv.tooltip.show([left, top], content, e.value < 0 ? 'e' : 'w', null, offsetElement);
      };
      

      实现以不同方式错误对齐工具提示。 所以我修改了为我解决问题的行为。你可以看看我的叉子https://github.com/ovvn/nvd3/blob/master/build/nv.d3.js

      【讨论】:

      • 感谢您的帖子。我尝试插入您的代码,但并没有解决我的问题。我的问题似乎来自第 832 行: if (tTop + height > scrollTop + windowHeight) top = scrollTop + windowHeight - tTop + top - height;这是计算到 -1768,我认为当您向下滚动以查看工具提示时,这就是将其推离页面的原因。
      • 我通过将默认重力更改为“s”解决了我的问题。我不知道如何将其设置为选项,所以我只是更改了 nvd3 代码。我很想将其更改为一个选项,但文档并不清楚。
      • 嗯,根据documentation 有一个选项,即chart.tooltip.gravity("n")
      • chart.tooltip.gravity('s'); --> Uncaught TypeError: Cannot read property 'gravity' of undefined 文档看不到最新的。我不确定如何从图表中获取工具提示 - 有人吗?
      • 终于弄明白了:chart.interactiveLayer.tooltip.gravity('s');您可以作为 chart.interactiveLayer 的属性访问工具提示
      猜你喜欢
      • 1970-01-01
      • 2015-03-07
      • 1970-01-01
      • 2016-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多