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 { | |
fill: #DDD; | |
stroke: #777; | |
stroke-width: 2px; | |
} | |
.node text { | |
font-family: sans-serif; | |
text-anchor: middle; | |
pointer-events: none; | |
user-select: none; | |
-webkit-user-select: none; | |
} | |
.link { | |
stroke: #88A; | |
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: "C", target: "A", type: "low"}, | |
{source: "D", target: "K", type: "low"}, | |
{source: "E", target: "A", type: "low"}, | |
{source: "F", target: "B", type: "low"}, | |
{source: "K", target: "J", type: "low"}, | |
{source: "F", target: "A", 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: "D", target: "E", 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 | |
svg.append('svg:defs') | |
.append('svg:marker') | |
.attr('id', 'end-arrow') | |
.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", 1) | |
; | |
// add second defs-marker | |
svg.append('svg:defs') | |
.append('svg:marker') | |
.attr('id', 'end-arrow-fade') | |
.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", 0.1) | |
var link = svg.selectAll(".link") | |
.data(force.links()) | |
.enter() | |
.append("line") | |
.attr("class", "link") | |
.attr('marker-end', 'url(#end-arrow)') | |
; | |
var node = svg.selectAll(".node") | |
.data(force.nodes()) | |
.enter().append("g") | |
.attr("class", "node") | |
.call(force.drag); | |
node.append("circle") | |
.attr("r", R) | |
.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 o.source === d || o.target === d ? 1 : opacity; | |
}); | |
link.attr("marker-end", function(o) { | |
return opacity === 1 || o.source === d || o.target === d ? 'url(#end-arrow)' : 'url(#end-arrow-fade)'; | |
}); | |
}; | |
} | |
</script> | |