D3 - 附加矩形停止工作提示

时间:2017-12-19 20:57:20

标签: javascript d3.js svg

我绘制了一个启用了工具提示的数据集。但是,如果我向svg添加更多元素,工具提示部分会生成错误。 作为一个具体的例子,我有:

var canvas = ....;
canvas.selectAll("rect")
.data(data)
...
...
.append("title")
.text(function(d){return tooltiptext;});
...
canvas.append("rect").attr("x",0).attr("y",0)
.attr("width",w).attr("height",h).style("fill","purple")
.style("fill-opacity",0.1);

添加最后一个canvas.append(...)会使工具提示部分无效。 我该如何解决这个问题?

这是一个有效的jsfiddle https://jsfiddle.net/kbkbkb/rkok5zmr/

谢谢

1 个答案:

答案 0 :(得分:0)

您追加的最后一个矩形位于所有内容之上。这有效地阻止了下面元素的鼠标悬停事件。

在svg中,元素按照它们被附加的顺序分层(新附加在前面附加的顶部),并且指针/鼠标事件默认不透视其他元素。

要解决此问题,您可以将紫色矩形的pointer-events属性设置为none:

.style("pointer-events","none")



var data = [5, 6, 3, 7, 10];

var w = 300,
  h = 200;

var ys = d3.scale.linear().domain([0, 10]).range([0, 0.9 * h]);
var bw = Math.floor(w / data.length);

var svg = d3.select("body")
  .append("svg")
  .attr("width", w)
  .attr("height", h);

svg.selectAll("rect")
  .data(data)
  .enter()
  .append("rect")
  .attr("width", bw * 0.9)
  .attr("height", function(d) {
    return ys(d);
  })
  .attr("x", function(d, i) {
    return bw * i;
  })
  .attr("y", function(d) {
    return h - ys(d);
  })
  .append("title")
  .text(function(d) {
    return d;
  });


svg.append("rect")
  .attr("x",0)
    .attr("y",0)
    .attr("width",w)
    .attr("height",h)
    .style("fill","purple")
    .style("fill-opacity",0.1)
    .style("pointer-events","none");  

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
&#13;
&#13;
&#13;

这有效地使元素可以看到鼠标事件。

或者你可以为紫色矩形设置一个类或id,并使用css将指针事件设置为无:

&#13;
&#13;
var data = [5, 6, 3, 7, 10];

var w = 300,
  h = 200;

var ys = d3.scale.linear().domain([0, 10]).range([0, 0.9 * h]);
var bw = Math.floor(w / data.length);

var svg = d3.select("body")
  .append("svg")
  .attr("width", w)
  .attr("height", h);

svg.selectAll("rect")
  .data(data)
  .enter()
  .append("rect")
  .attr("width", bw * 0.9)
  .attr("height", function(d) {
    return ys(d);
  })
  .attr("x", function(d, i) {
    return bw * i;
  })
  .attr("y", function(d) {
    return h - ys(d);
  })
  .append("title")
  .text(function(d) {
    return d;
  });


svg.append("rect")
  .attr("x",0)
    .attr("y",0)
    .attr("width",w)
    .attr("height",h)
    .style("fill","purple")
    .style("fill-opacity",0.1)
    .attr("class","overlay")
&#13;
.overlay{
  pointer-events: none;
}
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
&#13;
&#13;
&#13;

最后,作为一种不同的方法,您可以先将紫色矩形附加,以便图表的条形图位于其顶部,并且无需更改指针事件设置。 请注意,此方法需要更改条形图的输入选择 - selectAll(&#34; rect&#34;)将包含紫色矩形,因此您可以将其更改为selectAll(null),因为我在我的例子中做了。

&#13;
&#13;
var data = [5, 6, 3, 7, 10];

var w = 300,
  h = 200;

var ys = d3.scale.linear().domain([0, 10]).range([0, 0.9 * h]);
var bw = Math.floor(w / data.length);

var svg = d3.select("body")
  .append("svg")
  .attr("width", w)
  .attr("height", h);


svg.append("rect")
  .attr("x",0)
    .attr("y",0)
    .attr("width",w)
    .attr("height",h)
    .style("fill","purple")
    .style("fill-opacity",0.1)

svg.selectAll(null)
  .data(data)
  .enter()
  .append("rect")
  .attr("width", bw * 0.9)
  .attr("height", function(d) {
    return ys(d);
  })
  .attr("x", function(d, i) {
    return bw * i;
  })
  .attr("y", function(d) {
    return h - ys(d);
  })
  .append("title")
  .text(function(d) {
    return d;
  });
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.4.11/d3.min.js"></script>
&#13;
&#13;
&#13;

我在答案中将您的变量名称canvas更改为svg,因为画布可能会产生误导,因为d3可视化通常使用canvas而不是svg,并且两者都涉及不同的方法实施