Built with blockbuilder.org
forked from jalapic's block: network fade
Built with blockbuilder.org
forked from jalapic's block: network fade
| <!DOCTYPE html> | |
| <meta charset="utf-8"> | |
| <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.5/d3.min.js"></script> | |
| <script src="http://marvl.infotech.monash.edu/webcola/cola.v3.min.js"></script> | |
| <script type="text/javascript" src="http://mbostock.github.com/d3/d3.geom.js"></script> | |
| <script type="text/javascript" src="http://mbostock.github.com/d3/d3.layout.js"></script> | |
| <style> | |
| .node circle { | |
| stroke-width: 2px; | |
| } | |
| .node text { | |
| font-family: sans-serif; | |
| text-anchor: middle; | |
| pointer-events: none; | |
| user-select: none; | |
| -webkit-user-select: none; | |
| } | |
| .link { | |
| stroke-width: 4px; | |
| } | |
| text { | |
| font: 18px sans-serif; | |
| pointer-events: none; | |
| } | |
| #end-arrow { | |
| fill: #88A; | |
| } | |
| </style> | |
| <body> | |
| <script> | |
| function bar() { | |
| console.log("click"); | |
| force.stop(); | |
| force.start(); | |
| } | |
| var links = [ | |
| {source: "A", target: "D", type: "high"}, | |
| {source: "A", target: "K", type: "high"}, | |
| {source: "B", target: "G", type: "high"}, | |
| {source: "H", target: "B", type: "high"}, | |
| {source: "C", target: "A", type: "low"}, | |
| {source: "C", target: "L", type: "low"}, | |
| {source: "E", target: "A", type: "low"}, | |
| {source: "F", target: "B", type: "low"}, | |
| {source: "F", target: "G", type: "low"}, | |
| {source: "K", target: "J", type: "low"}, | |
| {source: "F", target: "I", type: "low"}, | |
| {source: "G", target: "H", type: "low"}, | |
| {source: "E", target: "K", type: "high"}, | |
| {source: "E", target: "G", type: "low"}, | |
| {source: "E", target: "F", type: "high"}, | |
| {source: "E", target: "M", type: "high"}, | |
| ]; | |
| var nodes = {}; | |
| // Compute the distinct nodes from the links. | |
| links.forEach(function(link) { | |
| link.source = nodes[link.source] || (nodes[link.source] = {name: link.source}); | |
| link.target = nodes[link.target] || (nodes[link.target] = {name: link.target}); | |
| }); | |
| var width = 960, | |
| height = 700; | |
| var force = d3.layout.force() | |
| .nodes(d3.values(nodes)) | |
| .links(links) | |
| .size([width, height]) | |
| .linkDistance(105) | |
| .charge(-775) | |
| .on("tick", tick) | |
| .start(); | |
| force.on("start", function () { | |
| console.log("start"); | |
| }); | |
| force.on("end", function () { | |
| console.log("end"); | |
| }); | |
| R=18 | |
| var svg = d3.select("body").append("svg") | |
| .attr("width", width) | |
| .attr("height", height); | |
| // add defs-marker | |
| // add defs-markers | |
| svg.append('svg:defs').selectAll("marker") | |
| .data([{id:"end-arrow", opacity:1}, {id:"end-arrow-fade", opacity:0.075}]) | |
| .enter().append('marker') | |
| .attr('id', function(d) { return d.id; }) | |
| .attr('viewBox', '0 0 10 10') | |
| .attr('refX', 2+R) | |
| .attr('refY', 5) | |
| .attr('markerWidth', 4) | |
| .attr('markerHeight', 4) | |
| .attr('orient', 'auto') | |
| .append('svg:path') | |
| .attr('d', 'M0,0 L0,10 L10,5 z') | |
| .style("opacity", function(d) { return d.opacity; }); | |
| //phantom marker | |
| svg.append('svg:defs') | |
| .append('svg:marker') | |
| .attr('id', 'end-arrow-phantom') | |
| .attr('viewBox', '0 0 10 10') | |
| .attr('refX', 2+R) | |
| .attr('refY', 5) | |
| .attr('markerWidth', 4) | |
| .attr('markerHeight', 4) | |
| .attr('orient', 'auto') | |
| .attr('fill', '#EEE') | |
| .append('svg:path') | |
| .attr('d', 'M0,0 L0,10 L10,5 z'); | |
| var link = svg.selectAll(".link") | |
| .data(force.links()) | |
| .enter() | |
| .append("line") | |
| .attr("class", "link") | |
| .attr("stroke", "#88A") | |
| .attr('marker-end', 'url(#end-arrow)') | |
| .on("mouseout", fade(1)) | |
| ; | |
| var node = svg.selectAll(".node") | |
| .data(force.nodes()) | |
| .enter().append("g") | |
| .attr("class", "node") | |
| .call(force.drag); | |
| node.append("circle") | |
| .attr("r", R) | |
| .attr("stroke", '#777') | |
| .attr("fill", '#DDD') | |
| .on("mouseover", fade(.1)) | |
| .on("mouseout", fade(1)) | |
| ; | |
| node.append("text") | |
| .attr("x", 0) | |
| .attr("dy", ".35em") | |
| .text(function(d) { return d.name; }); | |
| function tick() { | |
| link | |
| .attr("x1", function(d) { return d.source.x; }) | |
| .attr("y1", function(d) { return d.source.y; }) | |
| .attr("x2", function(d) { return d.target.x; }) | |
| .attr("y2", function(d) { return d.target.y; }) | |
| ; | |
| node | |
| .attr("transform", function(d) { return "translate(" + d.x + "," + d.y + ")"; }); | |
| } | |
| var linkedByIndex = {}; | |
| links.forEach(function(d) { | |
| linkedByIndex[d.source.index + "," + d.target.index] = 1; | |
| }); | |
| function isConnected(a, b) { | |
| return linkedByIndex[a.index + "," + b.index] || linkedByIndex[b.index + "," + a.index] || a.index == b.index; | |
| } | |
| function fade(opacity) { | |
| return function(d) { | |
| node.style("stroke-opacity", function(o) { | |
| thisOpacity = isConnected(d, o) ? 1 : opacity; | |
| this.setAttribute('fill-opacity', thisOpacity); | |
| return thisOpacity; | |
| }); | |
| link.style("stroke-opacity", function(o) { | |
| return opacity === 1 || o.source === d || o.target === d ? 1 : opacity/2; | |
| }); | |
| link.attr("marker-end", function(o) { | |
| return opacity === 1 || o.source === d || o.target === d ? 'url(#end-arrow)' : 'url(#end-arrow-phantom)'; | |
| }); | |
| }; | |
| } | |
| </script> | |