2017-02-17 16 views
1

私はD3JSのv4で概念証明を作成しています。私がやろうとしていることの1つは、データポイント上にカーソルを置いたときにツールチップが表示されることです。このhereの良い例が見つかりました。d3js v4のツールチップとのやりとり

私が今必要とするのは、リンク(またはクリック可能な要素)をツールチップに追加することです。上記の例に基づいてplunkrを作成し、ツールチップへのリンクを追加しました。私はリンクをクリックすることができず、z-インデックスが行く限り、ツールチップは線グラフの下に表示されます。

私はチャート上でZ-インデックスを設定しようとしましたが、ツールチップは役立たないようにしました。誰かがこれを並べ替えるために正しい方向に私を指すことができますか?

リンクの例をもとに、あなたのツールヒントを作成するとき、あなたはそのCSSをコピーし
<!DOCTYPE html> 
<meta charset="utf-8"> 
<style> /* set the CSS */ 

.line { 
    fill: none; 
    stroke: steelblue; 
    stroke-width: 2px; 
} 

div.tooltip { 
    position: absolute; 
    text-align: center; 
    width: 150px; 
    height: 100px; 
    padding: 2px; 
    font: 12px sans-serif; 
    background: lightsteelblue; 
    border: 0px; 
    border-radius: 8px; 
    pointer-events: none; 
} 

</style> 
<body> 

<!-- load the d3.js library --> 
<script src="https://d3js.org/d3.v4.min.js"></script> 
<script> 

// set the dimensions and margins of the graph 
var margin = {top: 20, right: 20, bottom: 30, left: 50}, 
    width = 960 - margin.left - margin.right, 
    height = 500 - margin.top - margin.bottom; 

// parse the date/time 
var parseTime = d3.timeParse("%d-%b-%y"); 
var formatTime = d3.timeFormat("%e %B"); 

// set the ranges 
var x = d3.scaleTime().range([0, width]); 
var y = d3.scaleLinear().range([height, 0]); 

// define the line 
var valueline = d3.line() 
    .x(function(d) { return x(d.date); }) 
    .y(function(d) { return y(d.close); }); 

// append the svg obgect to the body of the page 
// appends a 'group' element to 'svg' 
// moves the 'group' element to the top left margin 
var svg = d3.select("body").append("svg") 
    .attr("width", width + margin.left + margin.right) 
    .attr("height", height + margin.top + margin.bottom) 
    .append("g") 
    .attr("transform", 
      "translate(" + margin.left + "," + margin.top + ")"); 

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

// Get the data 
d3.csv("data.csv", function(error, data) { 
    if (error) throw error; 

    // format the data 
    data.forEach(function(d) { 
     d.date = parseTime(d.date); 
     d.close = +d.close; 
    }); 

    // scale the range of the data 
    x.domain(d3.extent(data, function(d) { return d.date; })); 
    y.domain([0, d3.max(data, function(d) { return d.close; })]); 

    // add the valueline path. 
    svg.append("path") 
    .data([data]) 
    .attr("class", "line") 
    .attr("d", valueline); 

    // add the dots with tooltips 
    svg.selectAll("dot") 
    .data(data) 
    .enter().append("circle") 
    .attr("r", 5) 
    .attr("cx", function(d) { return x(d.date); }) 
    .attr("cy", function(d) { return y(d.close); }) 
    .on("mouseover", function(d) { 
     div.transition() 
     .duration(200) 
     .style("opacity", .9); 
     div.html(formatTime(d.date) + "<br/>" + d.close + "<br/><a href='www.google.com'>Test it</a>") 
     .style("left", (d3.event.pageX) + "px") 
     .style("top", (d3.event.pageY - 28) + "px"); 
     }); 

    // add the X Axis 
    svg.append("g") 
     .attr("transform", "translate(0," + height + ")") 
     .call(d3.axisBottom(x)); 

    // add the Y Axis 
    svg.append("g") 
     .call(d3.axisLeft(y)); 

}); 

</script> 
</body> 
+0

:あなたのツールチップのCSSでNONE':それはhttps://plnkr.co/edit/xfa8cjQd3tHYNu0dUla4?p=preview –

+0

@GerardoFurtadoれたこと、ありがとう!これを回答として追加すると私はそれを受け入れるでしょう – hellsgate

答えて

2

div.tooltip { 
    pointer-events: none; 
    ... 
} 

リンクされている例が行ったように、我々は一般的に、<div>ツールチップにnonepointer-eventsを設定した理由を、我々はmouseover(普通はツールヒントの不透明度をゼロに設定する)を発生させた要素に対してmouseoutイベントを取得したいのですが、ツールチップが要素から(場合によっては直接上に)閉じるように配置されていると、 divとruinはmouseoutです。それ以外にも、pointer-eventsnoneに設定するもう1つの重要な理由は、ヒントの背後にある他の要素が、ツールチップが存在しない場合と同様に、mouseoverイベントを取得できることです。

ただし、コードにはmouseoutが含まれていないため、ここでの簡単な解決策は、CSSのpointer-events: noneを単純に削除することです。そうすれば<div>clickイベントを取得します。

これは更新plunkerです:ちょうど `ポインタイベントを削除https://plnkr.co/edit/xfa8cjQd3tHYNu0dUla4?p=preview

関連する問題