You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

317 lines
11 KiB

  1. var json = [
  2. {
  3. "name": "张三",
  4. "parent": "null",
  5. "children": [
  6. {
  7. "name": "李四",
  8. "parent": "张三",
  9. "children": [
  10. {
  11. "name": "王五",
  12. "parent": "李四",
  13. "children": [
  14. {"name": "程六","parent": "王五" },
  15. {"name": "王八","parent": "王五" },
  16. {"name": "王七","parent": "王五" },
  17. {
  18. "name": "王九",
  19. "parent": "王五",
  20. "children":[
  21. {"name": "王十","parent": "王五" },
  22. {"name": "王十一","parent": "王五" },
  23. {"name": "王十二","parent": "王五" },
  24. {"name": "王十三","parent": "王五" },
  25. {"name": "王十四","parent": "王五" },
  26. {
  27. "name": "程五",
  28. "parent": "王五",
  29. "children":[
  30. {"name": "程六","parent": "程五" },
  31. {"name": "程七","parent": "程五" },
  32. {"name": "程八","parent": "程五" },
  33. {"name": "小张","parent": "小红" },
  34. {"name": "小王","parent": "小红" },
  35. {"name": "小程","parent": "小红" },
  36. {"name": "小陈","parent": "小红" },
  37. {"name": "小明","parent": "小红" },
  38. {"name": "小张","parent": "小红" },
  39. {"name": "小王","parent": "小红" },
  40. {"name": "小程","parent": "小红" },
  41. {"name": "小陈","parent": "小红" },
  42. {"name": "小明","parent": "小红" },
  43. {"name": "小张","parent": "小红" },
  44. {"name": "小王","parent": "小红" },
  45. {"name": "小程","parent": "小红" },
  46. {"name": "小陈","parent": "小红" },
  47. {"name": "小明","parent": "小红" },
  48. {"name": "小张","parent": "小红" },
  49. {"name": "小王","parent": "小红" },
  50. {"name": "小程","parent": "小红" },
  51. {"name": "小陈","parent": "小红" },
  52. {"name": "程九","parent": "程五" },
  53. {
  54. "name": "程十",
  55. "parent": "程五",
  56. "children":[
  57. {"name": "程十一","parent": "程十" },
  58. {"name": "程十二","parent": "程十" },
  59. {"name": "程十三","parent": "程十" },
  60. {"name": "小张","parent": "小红" },
  61. {"name": "小王","parent": "小红" },
  62. {"name": "小程","parent": "小红" },
  63. {"name": "小陈","parent": "小红" },
  64. {"name": "小明","parent": "小红" },
  65. {"name": "小张","parent": "小红" },
  66. {"name": "小王","parent": "小红" },
  67. {"name": "小程","parent": "小红" },
  68. {"name": "小陈","parent": "小红" },
  69. {"name": "小明","parent": "小红" },
  70. {"name": "小张","parent": "小红" },
  71. {"name": "小王","parent": "小红" },
  72. {"name": "小程","parent": "小红" },
  73. {"name": "小陈","parent": "小红" },
  74. {"name": "小明","parent": "小红" },
  75. {"name": "小张","parent": "小红" },
  76. {"name": "小王","parent": "小红" },
  77. {"name": "小程","parent": "小红" },
  78. {"name": "小陈","parent": "小红" },
  79. ]
  80. },
  81. ]
  82. }
  83. ]
  84. }
  85. ]
  86. },
  87. {
  88. "name": "马一",
  89. "parent": "李四",
  90. "children":[
  91. {"name": "马二","parent": "马一" },
  92. {"name": "马三","parent": "马一" },
  93. {"name": "马四","parent": "马一" },
  94. {"name": "马五","parent": "马一" },
  95. {"name": "马六","parent": "马一" },
  96. {"name": "马七","parent": "马一" },
  97. {"name": "小明","parent": "小红" },
  98. {"name": "小张","parent": "小红" },
  99. {"name": "小王","parent": "小红" },
  100. {"name": "小程","parent": "小红" },
  101. {"name": "小陈","parent": "小红" },
  102. {"name": "小明","parent": "小红" },
  103. {"name": "小张","parent": "小红" },
  104. {"name": "小王","parent": "小红" },
  105. {"name": "小程","parent": "小红" },
  106. {"name": "小陈","parent": "小红" },
  107. {"name": "小张","parent": "小红" },
  108. {"name": "小王","parent": "小红" },
  109. {"name": "小程","parent": "小红" },
  110. {"name": "小陈","parent": "小红" },
  111. {"name": "小明","parent": "小红" },
  112. {"name": "小张","parent": "小红" },
  113. {"name": "小王","parent": "小红" },
  114. {"name": "小程","parent": "小红" },
  115. {"name": "小陈","parent": "小红" },
  116. {"name": "小明","parent": "小红" },
  117. {"name": "小张","parent": "小红" },
  118. {"name": "小王","parent": "小红" },
  119. {"name": "小程","parent": "小红" },
  120. {"name": "小陈","parent": "小红" },
  121. {"name": "小明","parent": "小红" },
  122. {"name": "小张","parent": "小红" },
  123. {"name": "小王","parent": "小红" },
  124. {"name": "小程","parent": "小红" },
  125. {"name": "小陈","parent": "小红" },
  126. {"name": "小明","parent": "小红" },
  127. {"name": "小张","parent": "小红" },
  128. {"name": "小王","parent": "小红" },
  129. {"name": "小程","parent": "小红" },
  130. {"name": "小陈","parent": "小红" },
  131. {"name": "小明","parent": "小红" },
  132. {"name": "小张","parent": "小红" },
  133. {"name": "小王","parent": "小红" },
  134. {"name": "小程","parent": "小红" },
  135. {"name": "小陈","parent": "小红" },
  136. ]
  137. }
  138. ]
  139. },
  140. {
  141. "name": "小红",
  142. "parent": "张三",
  143. "children":[
  144. {"name": "小明","parent": "小红" },
  145. {"name": "小张","parent": "小红" },
  146. {"name": "小王","parent": "小红" },
  147. {"name": "小程","parent": "小红" },
  148. {"name": "小陈","parent": "小红" },
  149. {"name": "小明","parent": "小红" },
  150. {"name": "小张","parent": "小红" },
  151. {"name": "小王","parent": "小红" },
  152. {"name": "小程","parent": "小红" },
  153. {"name": "小陈","parent": "小红" },
  154. {"name": "小明","parent": "小红" },
  155. {"name": "小张","parent": "小红" },
  156. {"name": "小王","parent": "小红" },
  157. {"name": "小程","parent": "小红" },
  158. {"name": "小陈","parent": "小红" },
  159. {"name": "小明","parent": "小红" },
  160. {"name": "小张","parent": "小红" },
  161. {"name": "小王","parent": "小红" },
  162. {"name": "小程","parent": "小红" },
  163. {"name": "小陈","parent": "小红" },
  164. {"name": "小明","parent": "小红" },
  165. {"name": "小张","parent": "小红" },
  166. {"name": "小王","parent": "小红" },
  167. {"name": "小程","parent": "小红" },
  168. {"name": "小陈","parent": "小红" },
  169. {"name": "小明","parent": "小红" },
  170. {"name": "小张","parent": "小红" },
  171. {"name": "小王","parent": "小红" },
  172. {"name": "小程","parent": "小红" },
  173. {"name": "小陈","parent": "小红" },
  174. ]
  175. }
  176. ]
  177. }
  178. ];
  179. var margin = [20, 120, 20, 120],
  180. width = document.getElementById("brainmap").offsetWidth,
  181. height = document.getElementById("brainmap").offsetHeight;
  182. var i = 0,
  183. duration = 750,
  184. root;
  185. var tree = d3.layout.tree()
  186. .size([height, width]);
  187. var diagonal = d3.svg.diagonal()
  188. .projection(function(d) { return [d.y, d.x]; });
  189. var zoom = d3.behavior.zoom().scaleExtent([0.1, 100]).on("zoom", zoomed);//添加放大缩小事件
  190. var svg = d3.select("body").select("#brainmap").append("svg")
  191. .call(zoom)//给svg绑定zoom事件
  192. .append("g")
  193. .call(zoom)//给g绑定zoom事件
  194. .append("g")
  195. .attr("transform", "translate(" + margin[3] + "," + margin[0] + ")");
  196. root = json[0];
  197. root.x0 = height / 2;
  198. root.y0 = 0;
  199. function collapse(d) {
  200. if (d.children) {
  201. d._children = d.children;
  202. d._children.forEach(collapse);
  203. d.children = null;
  204. }
  205. }
  206. root.children.forEach(collapse);
  207. update(root);
  208. function zoomed() {
  209. svg.attr("transform",
  210. "translate(" + zoom.translate() + ")" +
  211. "scale(" + zoom.scale() + ")"
  212. );
  213. }
  214. function update(source) {
  215. // Compute the new tree layout.
  216. var nodes = tree.nodes(root).reverse(),
  217. links = tree.links(nodes);
  218. // Normalize for fixed-depth.
  219. nodes.forEach(function(d) { d.y = d.depth * 180; });
  220. // Update the nodes…
  221. var node = svg.selectAll("g.node")
  222. .data(nodes, function(d) { return d.id || (d.id = ++i); });
  223. // Enter any new nodes at the parent's previous position.
  224. var nodeEnter = node.enter().append("g")
  225. .attr("class", "node")
  226. .attr("transform", function(d) { return "translate(" + source.y0 + "," + source.x0 + ")"; })
  227. .on("click", click);
  228. nodeEnter.append("circle")
  229. .attr("r", 1e-6)
  230. .style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; });
  231. nodeEnter.append("text")
  232. .attr("x", function(d) { return d.children || d._children ? -10 : 10; })
  233. .attr("dy", ".35em")
  234. .attr("text-anchor", function(d) { return d.children || d._children ? "end" : "start"; })
  235. .text(function(d) { return d.name; })
  236. .style("fill-opacity", 1e-6);
  237. var nodeUpdate = node.transition()
  238. .duration(duration)
  239. .attr("transform", function(d) { return "translate(" + d.y + "," + d.x + ")"; });
  240. nodeUpdate.select("circle")
  241. .attr("r", 4.5)
  242. .style("fill", function(d) { return d._children ? "lightsteelblue" : "#fff"; });
  243. nodeUpdate.select("text")
  244. .style("fill-opacity", 1);
  245. var nodeExit = node.exit().transition()
  246. .duration(duration)
  247. .attr("transform", function(d) { return "translate(" + source.y + "," + source.x + ")"; })
  248. .remove();
  249. nodeExit.select("circle")
  250. .attr("r", 1e-6);
  251. nodeExit.select("text")
  252. .style("fill-opacity", 1e-6);
  253. var link = svg.selectAll("path.link")
  254. .data(links, function(d) { return d.target.id; });
  255. link.enter().insert("path", "g")
  256. .attr("class", "link")
  257. .attr("d", function(d) {
  258. var o = {x: source.x0, y: source.y0};
  259. return diagonal({source: o, target: o});
  260. });
  261. link.transition()
  262. .duration(duration)
  263. .attr("d", diagonal);
  264. link.exit().transition()
  265. .duration(duration)
  266. .attr("d", function(d) {
  267. var o = {x: source.x, y: source.y};
  268. return diagonal({source: o, target: o});
  269. })
  270. .remove();
  271. nodes.forEach(function(d) {
  272. d.x0 = d.x;
  273. d.y0 = d.y;
  274. });
  275. }
  276. function click(d) {
  277. if (d.children) {
  278. d._children = d.children;
  279. d.children = null;
  280. } else {
  281. d.children = d._children;
  282. d._children = null;
  283. }
  284. update(d);
  285. }