【问题标题】:d3 transition on tooltip not working工具提示上的 d3 过渡不起作用
【发布时间】:2014-06-03 19:15:42
【问题描述】:

我有一个多折线图,鼠标悬停上的每个点都会显示一个工具提示。鼠标移出时,工具提示会消失,并带有一些过渡效果。过渡适用于鼠标悬停,但不适用于鼠标移出。这是代码sn-p

    var div = d3.select("body").append("div")
      .attr("class", "tooltip")
      .style("opacity", 0);

    to_graph.forEach(function(d) {
          svg.selectAll("dot")
              .data(d.data)
              .enter()
              .append("svg:circle")
              .attr("r", 5)
              .attr("cx", function(v) {
                  return x(v[0]);
              })
              .attr("cy", function(v) {
                  return y(v[1]);
              })
              .attr("stroke", "black")
              .attr("stroke-width", "2")
              .attr("fill", "white")
              .on("mouseover", function(v) {
                  div.transition()
                      .duration(200)
                      .style("opacity", '.9');
                  var text = formatTime(v[0]) + "<br/>" + v[1] + "<br/>" + d.label;
                  div.html(text)
                      .style("left", (d3.event.pageX)+"px")
                      .style("top", (d3.event.pageY-28) + "px")
                      .attr("fill", "steelblue")
                      //.style("opacity", '.9'); <---- NOT USEFUL
              })
              .on("mouseout", function() {
                  console.log(div);       // <----- div is defined
                  div.transition().duration(200)
                      .style("opacity", "0");
                  //d3.select(this)
                    //  .attr("fill", "transparent");
              });
      });

我可能在这里遗漏了一些非常明显的东西。当我在鼠标移出时删除过渡时,它可以工作,但在过渡时却不行。

谢谢!

这是完整(简化)的图形代码:

// general format
var graph_data = {"data": [y1, y2, ...], "alerts": [null, y2, null, y3...]};

// establish margin and padding

  var margin = {
      top: 0,
      right: 0,
      bottom: 0,
      left: 0
  };
  var width = 1000 - margin.left - margin.right;
  var height = 400 - margin.top - margin.bottom;
  var xpadding = 70,
      ypadding = 70;

  // svg to hold the graph
  var svg = d3.select("#"+container)
      .append("svg")
      .attr("width", width)
      .attr("height", height)
      .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

  // x-axis scale and min-max values
  var x = d3.time.scale()
      .range([xpadding, width-xpadding*2])
      .domain([dateFrom, dateTo]);

        // y-axis scale and min-max values
  var y = d3.scale.linear()
      .range([height-ypadding, ypadding])
      .domain([
          0,
          d3.max(graph_data.data)
      ]);

  // xaxis
  var xaxis = d3.svg.axis()
      .scale(x)
      .orient("bottom");

  // yaxis
  var yaxis = d3.svg.axis()
      .scale(y)
      .orient("left")
      .ticks(5);

  svg.append("g")
      .attr("class", "x axis")
      .attr("transform", "translate(0," + (height - xpadding) + ")")
      .call(xaxis);

  svg.append("g")
      .attr("class", "y axis")
      .attr("transform", "translate(" + ypadding + ",0)")
      .call(yaxis);

// points and tooltips on the chart for mouseover
  var div = d3.select("body").append("div")
      .attr("class", "tooltip")
      .style("opacity", 0);

  // draw alerts as dots
  var formatTime = d3.time.format("%a %e %B %I %p");
  var plot_data = formatData(graph_data.alerts, dateFrom);
  // filter out null values in alerts
  plot_data = plot_data.filter(function (d) {
      return d[1] !== null;
  });
  svg.selectAll("dot")
      .data(plot_data)
      .enter()
      .append("svg:circle")
      .attr("r", 5)
      .attr("cx", function(v) {
          return x(v[0]);
      })
      .attr("cy", function(v) {
          return y(v[1]);
      })
      .attr("stroke", "black")
      .attr("stroke-width", "2")
      .attr("fill", "red")
      .on("mouseover", function(v) {
          div.transition()
              .duration(200)
              .style("opacity", 0.9);
          var text = "Alert<br/>"+ formatTime(v[0]) + "<br/>" + v[1];
          div.html(text)
              .style("left", (d3.event.pageX)+"px")
              .style("top", (d3.event.pageY-28) + "px")
              .attr("fill", "steelblue")
              .style("opacity", 0.9);
      })
      .on("mouseout", function() {
          console.log(div);
          div.transition().duration(200)
              .style("opacity", 0);
      })

【问题讨论】:

  • 您是否尝试过给opacity 提供数字而不是字符串,即.90 而不是".9""0"
  • 试过了,提示信息还在。
  • 我有非常相似的代码在另一个页面上工作,并且工作正常。对于这件作品,控制台中没有错误,并且鼠标悬停触发器有效。太奇怪了。
  • 嗯,你能提供一个完整的例子吗?
  • 我无法在 jsfiddle 中重现问题的简化版本,但我可以在我的代码库中重现。让我贴在这里

标签: javascript d3.js tooltip transition


【解决方案1】:

我在http://jsfiddle.net/Xh2vj/1/ 稍微更新了您的演示,并将转换时间设置为 1000 毫秒,以便更容易识别动画。工具提示淡入淡出 - 它适用于我:

没有太大变化,但删除了鼠标悬停时的“即时弹出”:

      .on("mouseover", function(v) {
             div.transition()
                  .duration(1000) //longer to easier be seen
                  .style("opacity", 0.9); //this is for the tooltip
              var text = "Alert<br/>"+ formatTime(v[0]) + "<br/>" + v[1];
              div.html(text)
                  .style("left", (d3.event.pageX)+"px")
                  .style("top", (d3.event.pageY-28) + "px")
                  .attr("fill", "steelblue");
                 // .style("opacity", 0.9); // not here
          })

在 Chrome 35、Safari 7 和 Firefox 29 等最新桌面浏览器上测试。 较旧的 Opera 12 难以解决鼠标悬停问题,可能工具提示会覆盖该点,因此鼠标悬停不再计算在内。你用什么浏览器?

【讨论】:

  • Chrome 版本 35.0.1916.114。是的,我尝试了不同的持续时间,值非常小和大..仍然无法正常工作!鼠标悬停/移出事件被触发..我已经用断点对其进行了测试。 div 的 transition 数组计数也会增加。想不出别的了。
  • 另请注意,jsfiddle 代码对我有用。它在我的代码库中不起作用..现在不确定它是否与其他图表冲突。
  • 所以可能与其他 D3 的东西有一些干扰,我只能用这些信息来猜测。对我来说,当我使用错误的选择器或可能覆盖另一个地方的定义时,图表通常会出现异常。检查您的代码库(或至少包含此图表和更多脚本的页面)中是否没有其他选择器和 d3.select("#"+container).append("svg") 定义...)。
  • 检查,如果有些覆盖你的 svg-container.mouseover 试试.on("mouseover", function(v) { console.log('mouseover at '+ container+ ' with ' + v[0]); div.transition...。希望只定义了一只鼠标。只是为了确定。
  • 有道理。给你一个基本的想法 - 我有 5 页 d3 但他们现在不共享代码或导入脚本。每页还有一个 d3 图表。我将图形容器名称更改为此问题页面的唯一名称。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 2013-08-29
  • 2018-03-09
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
相关资源
最近更新 更多