2016-04-15 73 views
-1

我正在使用d3樹佈局來構建圖形,並使用對角線元素來構建節點之間的鏈接。我想在鼠標懸停在鏈接上時顯示某些文本。嵌套懸停可能嗎?d3樹佈局顯示鼠標懸停在鏈接上的文本

var tooltip = d3.select("body") 
 
    .append("div") 
 
    .attr("class", "my-tooltip") //add the tooltip class 
 
    .style("position", "absolute") 
 
    .style("z-index", "10") 
 
    .style("visibility", "hidden"); 
 

 

 
var flare = { 
 
    "name": "Base", 
 
    "children": [{ 
 
    "name": "Type A", 
 
    "children": [{ 
 
     "name": "Section 1" 
 
    }, { 
 
     "name": "Section 2" 
 
    }] 
 
    }, { 
 
    "name": "Type B" 
 
    }] 
 
}; 
 
var margin = { 
 
    top: 20, 
 
    right: 120, 
 
    bottom: 20, 
 
    left: 120 
 
    }, 
 
    width = 960 - margin.right - margin.left, 
 
    height = 800 - margin.top - margin.bottom; 
 

 
var i = 0, 
 
    duration = 750, 
 
    root; 
 

 
var tree = d3.layout.tree() 
 
    .size([height, width]); 
 

 
var diagonal = d3.svg.diagonal() 
 
    .projection(function(d) { 
 
    return [d.y, d.x]; 
 
    }); 
 

 
var svg = d3.select("body").append("svg") 
 
    .attr("width", width + margin.right + margin.left) 
 
    .attr("height", height + margin.top + margin.bottom) 
 
    .append("g") 
 
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")"); 
 

 

 
//d3.json("http://bl.ocks.org/mbostock/raw/4063550/flare.json", function(error, flare) { 
 

 
root = flare; 
 
root.x0 = height/2; 
 
root.y0 = 0; 
 

 
function collapse(d) { 
 
    if (d.children) { 
 
    d._children = d.children; 
 
    d._children.forEach(collapse); 
 
    d.children = null; 
 
    } 
 
} 
 

 
root.children.forEach(collapse); 
 
update(root); 
 
//}); 
 

 
d3.select(self.frameElement).style("height", "800px"); 
 

 
function update(source) { 
 

 
    // Compute the new tree layout. 
 
    var nodes = tree.nodes(root).reverse(), 
 
    links = tree.links(nodes); 
 

 
    // Normalize for fixed-depth. 
 
    nodes.forEach(function(d) { 
 
    d.y = d.depth * 180; 
 
    }); 
 

 
    // Update the nodes… 
 
    var node = svg.selectAll("g.node") 
 
    .data(nodes, function(d) { 
 
     return d.id || (d.id = ++i); 
 
    }); 
 

 
    // Enter any new nodes at the parent's previous position. 
 
    var nodeEnter = node.enter().append("g") 
 
    .attr("class", "node") 
 
    .attr("transform", function(d) { 
 
     return "translate(" + source.y0 + "," + source.x0 + ")"; 
 
    }) 
 
    .on("click", click) 
 
    .on("mouseover", function(d) { 
 
     var g = d3.select(this); // The node 
 
     // The class is used to remove the additional text later 
 
     var info = g.append('text') 
 
     .classed('info', true) 
 
     .attr('x', 20) 
 
     .attr('y', 10) 
 
     .text("Sample text to be displayed"); 
 
    }) 
 
    .on("mouseout", function() { 
 
     // Remove the info text on mouse out. 
 
     d3.select(this).select('text.info').remove(); 
 
    }); 
 

 

 

 
    nodeEnter.append("circle") 
 
    .attr("r", 1e-6) 
 
    .style("fill", function(d) { 
 
     return d._children ? "lightsteelblue" : "#fff"; 
 
    }); 
 

 
    nodeEnter.append("text") 
 
    .attr("x", function(d) { 
 
     return d.children || d._children ? -10 : 10; 
 
    }) 
 
    .attr("dy", ".35em") 
 
    .attr("text-anchor", function(d) { 
 
     return d.children || d._children ? "end" : "start"; 
 
    }) 
 
    .text(function(d) { 
 
     return d.name; 
 
    }) 
 
    .style("fill-opacity", 1e-6); 
 

 
    // Transition nodes to their new position. 
 
    var nodeUpdate = node.transition() 
 
    .duration(duration) 
 
    .attr("transform", function(d) { 
 
     return "translate(" + d.y + "," + d.x + ")"; 
 
    }); 
 

 
    nodeUpdate.select("circle") 
 
    .attr("r", 4.5) 
 
    .style("fill", function(d) { 
 
     return d._children ? "lightsteelblue" : "#fff"; 
 
    }); 
 

 
    nodeUpdate.select("text") 
 
    .style("fill-opacity", 1); 
 

 
    // Transition exiting nodes to the parent's new position. 
 
    var nodeExit = node.exit().transition() 
 
    .duration(duration) 
 
    .attr("transform", function(d) { 
 
     return "translate(" + source.y + "," + source.x + ")"; 
 
    }) 
 
    .remove(); 
 

 
    nodeExit.select("circle") 
 
    .attr("r", 1e-6); 
 

 
    nodeExit.select("text") 
 
    .style("fill-opacity", 1e-6); 
 

 
    // Update the links… 
 
    var link = svg.selectAll("path.link") 
 
    .data(links, function(d) { 
 
     return d.target.id; 
 
    }) 
 

 
    // Enter any new links at the parent's previous position. 
 
    link.enter().insert("path", "g") 
 
    .attr("class", "link") 
 
    .attr("d", function(d) { 
 
     var o = { 
 
     x: source.x0, 
 
     y: source.y0 
 
     }; 
 
     return diagonal({ 
 
     source: o, 
 
     target: o 
 
     }); 
 
    }).on('mouseover', function(d) { 
 
     console.log(d); 
 
     tooltip.style("visibility", "visible") 
 
     .text('SOURCE : ' + d.source.name + ' || TARGET : ' + d.target.name) 
 
    }) 
 
    .on("mousemove", function() { 
 
     return tooltip.style("top", (d3.event.pageY - 40) + "px").style("left", (d3.event.pageX - 130) + "px"); 
 
    }) 
 
    .on("mouseout", function() { 
 
     return tooltip.style("visibility", "hidden"); 
 
    });; 
 

 
    // Transition links to their new position. 
 
    link.transition() 
 
    .duration(duration) 
 
    .attr("d", diagonal); 
 

 
    // Transition exiting nodes to the parent's new position. 
 
    link.exit().transition() 
 
    .duration(duration) 
 
    .attr("d", function(d) { 
 
     var o = { 
 
     x: source.x, 
 
     y: source.y 
 
     }; 
 
     return diagonal({ 
 
     source: o, 
 
     target: o 
 
     }); 
 
    }) 
 
    .remove(); 
 

 
    // Update the link text 
 
    var linktext = svg.selectAll("g.link") 
 
    .data(links, function(d) { 
 
     return d.target.id; 
 
    }); 
 
    linktext.enter() 
 
    .insert("g") 
 
    .attr("class", "link") 
 
    .append("text") 
 
    .attr("dy", ".35em") 
 
    .attr("text-anchor", "middle") 
 
    .text(function(d) { 
 
     //console.log(d.target.name); 
 
     return d.target.name; 
 
    }) 
 
    .on('mouseover',function(d){ 
 
    console.log('TEXT HOVER : ' + d.target.name) 
 
    }); 
 

 

 
    // Transition link text to their new positions 
 

 
    linktext.transition() 
 
    .duration(duration) 
 
    .attr("transform", function(d) { 
 
     return "translate(" + ((d.source.y + d.target.y)/2) + "," + ((d.source.x + d.target.x)/2) + ")"; 
 
    }) 
 

 
    //Transition exiting link text to the parent's new position. 
 
    linktext.exit().transition() 
 
    .remove(); 
 

 

 
    // Stash the old positions for transition. 
 
    nodes.forEach(function(d) { 
 
    d.x0 = d.x; 
 
    d.y0 = d.y; 
 
    }); 
 
} 
 

 
// Toggle children on click. 
 
function click(d) { 
 
    if (d.children) { 
 
    d._children = d.children; 
 
    d.children = null; 
 
    } else { 
 
    d.children = d._children; 
 
    d._children = null; 
 
    } 
 
    update(d); 
 
}
.node { 
 
    cursor: pointer; 
 
} 
 

 
.node circle { 
 
    fill: #fff; 
 
    stroke: steelblue; 
 
    stroke-width: 1.5px; 
 
} 
 

 
.node text { 
 
    font: 10px sans-serif; 
 
} 
 

 
path.link { 
 
    fill: none; 
 
    stroke: #ccc; 
 
    stroke-width: 1.5px; 
 
} 
 

 
.link text { 
 
    font: 10px sans-serif; 
 
    fill: #CC0000; 
 
} 
 

 
.my-tooltip { 
 
    background: rgba(0, 0, 255, 0.2); 
 
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.3.9/d3.min.js"></script>

+0

提供一些代碼或使小提琴 –

+0

HTTP:/ /jsfiddle.net/shak_k/zudxrd59/ – user2471313

回答

0

我想一個div追加到身體,設置visibilityhidden,並mouseover顯示在鼠標的位置股利。

所以追加DIV像這樣:

var tooltip = d3.select("body") 
     .append("div") 
     .attr("class", "my-tooltip")//add the tooltip class 
     .style("position", "absolute") 
     .style("z-index", "10") 
     .style("visibility", "hidden"); 

然後在鼠標設置文本(在這裏我剛纔做了一個例子,顯示的源和目標名稱:

.on('mouseover', function(d) { 
     console.log(d); 
     tooltip.style("visibility", "visible") 
     .text('SOURCE : ' + d.source.name + ' || TARGET : ' + d.target.name) 
    }) 

然後在mousemove更新位置:

.on("mousemove", function() { 
    return tooltip.style("top", (d3.event.pageY - 40) + "px").style("left", (d3.event.pageX - 130) + "px"); 
}) 

,然後隱藏它mouseout

.on("mouseout", function() { 
    return tooltip.style("visibility", "hidden"); 
}); 

然後你可以追加你想要的東西。只是在鏈路上的mouseover事件,只是追加到tooltip :)

更新小提琴:http://jsfiddle.net/thatoneguy/zudxrd59/5/

不要忘了CSS太:

.my-tooltip { 
    background: rgba(0, 0, 255, 0.2); 
} 
+0

非常感謝。我也想懸停在已經顯示的文字上,通過盤旋 – user2471313

+0

如果你的意思是隻是在文本上盤旋。看看我的更新示例:http://jsfiddle.net/reko91/zudxrd59/6/,在Javascript的第224行是我實現鼠標懸停。你可以在這裏做工具提示,只是將我所做的鏈接複製到鏈接文本 – thatOneGuy

+0

我想做類似嵌套懸停的操作。 – user2471313

相關問題