2016-04-15 7 views
-1

Ich benutze d3 Baum Layout, um ein Diagramm zu konstruieren und bin Diagonale Elemente verwenden, um Links zwischen den Knoten zu erstellen.Ich wollte bestimmten Text anzeigen, wenn die Maus über Links schwebt. Ist das Verschachteln möglich?d3 Baum-Layout zum Anzeigen von Text auf Maus über Mauszeiger schweben

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

einige Code zur Verfügung stellen oder Geige –

+0

http machen://jsfiddle.net/shak_k/zudxrd59/ – user2471313

Antwort

0

ich ein div auf den Körper anhängen würde, setzen visibility-hidden und auf mouseover zeigen die div an der Position der Maus.

anhängen So die div wie so:

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"); 

dann auf die Maus über den Text (hier habe ich nur ein Beispiel getan und die Quell- und Zielnamen dargestellt:

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

dann auf mousemove Update Position:

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

Und dann verstecken sie auf mouseout:

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

Und dann können Sie anhängen, was immer Sie wollen. Einfach auf das mouseover Ereignis auf den Link, hängen Sie einfach an die tooltip :)

Aktualisiert Geige: http://jsfiddle.net/thatoneguy/zudxrd59/5/

Vergessen Sie nicht, die CSS zu:

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

Vielen Dank. Ich wollte auch auf den Text schweben, der bereits durch Schweben – user2471313

+0

angezeigt wird, wenn Sie nur über den Text schweben. Schau dir mein aktuelles Beispiel an: http://jsfiddle.net/reko91/zudxrd59/6/, in Zeile 224 des Javascript setze ich Mouseover ein. Sie können den Tooltip hier kopieren, kopieren Sie einfach, was ich für die Links zum Linktext gemacht habe – thatOneGuy

+0

Ich wollte etwas wie verschachteltes Schweben tun. – user2471313

Verwandte Themen