JSFiddle - React, Tailwind, and code Playground
CSS
svg {
border: 1px dashed #ccc;
}
JavaScript
(function(){
/// generate some ipsum data ///
var id = 0;
function generateFakeData(depth, childrenMin, childrenMax)
{
var data = {
id: id++,
children: []
};
if ( --depth > 0 ) {
var childrenCount = Math.floor(Math.random()*(childrenMax-childrenMin)+childrenMin);
for (var i=0; i < childrenCount; i++) {
data.children.push(generateFakeData(depth, childrenMin, childrenMax));
};
};
return data;
}
var data = generateFakeData(5, 3, 5);
/// actual code ///
var margin = 20,
width = 350 - margin*2,
height = 500 - margin*2;
var container = d3.select('body');
var svg = container.append('svg')
.attr('width', width+margin*2)
.attr('height', height+margin*2)
.call(d3.behavior.zoom().on('zoom', zoom).scaleExtent([0.2, 2]))
.append('g')
.attr('transform', 'translate('+margin+','+margin+')');
var diagonal = d3.svg.diagonal()
.projection(function(d) { return [d.y, d.x]; });
var tree = d3.layout.tree()
.size([height, width]);
var nodes = tree.nodes(data),
links = tree.links(nodes);
svg.selectAll('.link')
.data(links)
.enter()
.append('path')
.attr('class', 'link')
.attr('fill', 'none')
.attr('stroke', '#ccc')
.attr('d', diagonal);
var node = svg.selectAll('.node')
.data(nodes)
.enter()
.append('g')
.attr('class', 'node')
.attr('transform', function(d){
return 'translate('+d.y+','+d.x+')'
});
node.append('circle')
.attr('r', 5)
.attr('fill', 'none')
.attr('stroke', 'red');
function zoom() {
var scale = d3.event.scale;
svg.attr('transform',...