赞
踩
有一些 JavaScript 库可以帮助你创建网络拓扑图,并且支持将每个节点作为超链接。
以下是一些我推荐的库:
为什么我推荐使用D3.js呢?因为一个库比较看重的是它在开源项目中的数据,毕竟使用的人越多,它的功能就会越有动力做优化。
D3.js 是一个 JavaScript 库,用于基于数据操作文档。D3 可帮助您使用 HTML、SVG 和 CSS 使数据栩栩如生。D3 对 Web 标准的强调为您提供了现代浏览器的全部功能,而无需将自己绑定到专有框架,将强大的可视化组件和数据驱动的 DOM 操作方法相结合。
D3 允许您将任意数据绑定到文档对象模型 (DOM),然后将数据驱动的转换应用于文档。例如,可以使用 D3 从数字数组生成 HTML 表。或者,使用相同的数据创建具有平滑过渡和交互的交互式 SVG 条形图。
D3 不是一个寻求提供所有可能功能的整体框架。相反,D3 解决了问题的症结:基于数据高效操作文档。这避免了专有表示,并提供了非凡的灵活性,公开了 HTML、SVG 和 CSS 等 Web 标准的全部功能。D3 开销最小,速度极快,支持大型数据集以及交互和动画的动态行为。D3 的函数式风格允许通过各种官方和社区开发的模块重用代码。
根据 npm trends 的数据,以下是这些库的使用情况:
从这些数据来看,D3.js 是使用人数最多的库,其次是 Cytoscape.js 和 GoJS。Sigma.js 和 Vis.js 的使用人数相对较少。
我使用D3.js写了一个 demo,实现了基本都节点连接和超链接功能,源码如下。
<!DOCTYPE html> <html> <head> <title>D3.js Network Topology Demo</title> <script src="https://d3js.org/d3.v7.min.js"></script> </head> <body> <script> // 创建 SVG 元素 var svg = d3.select("body") .append("svg") .attr("width", 800) .attr("height", 600); // 定义节点和链接的数据 var nodes = [ {id: "Router", url: "https://www.example1.com"}, {id: "Switch", url: "https://www.example2.com"}, {id: "Host 1", url: "https://www.example3.com"}, {id: "Host 2", url: "https://www.example4.com"}, {id: "Host 3", url: "https://www.example5.com"} ]; var links = [ {source: nodes[0], target: nodes[1]}, {source: nodes[1], target: nodes[2]}, {source: nodes[1], target: nodes[3]}, {source: nodes[1], target: nodes[4]} ]; // 创建力导向图 var simulation = d3.forceSimulation(nodes) .force("link", d3.forceLink(links).distance(200)) .force("charge", d3.forceManyBody().strength(-400)) .force("center", d3.forceCenter(400, 300)); // 创建链接 var link = svg.append("g") .selectAll("line") .data(links) .join("line") .attr("stroke", "#999") .attr("stroke-opacity", 0.6); // 创建节点 var node = svg.append("g") .selectAll("a") .data(nodes) .join("a") .attr("xlink:href", d => d.url) .attr("target", "_blank") .call(drag(simulation)); node.append("circle") .attr("r", 20) .attr("fill", "#69b3a2"); node.append("text") .attr("dy", "0.35em") .attr("x", 25) .text(d => d.id); // 更新力导向图 simulation.on("tick", () => { link.attr("x1", d => d.source.x) .attr("y1", d => d.source.y) .attr("x2", d => d.target.x) .attr("y2", d => d.target.y); node.attr("transform", d => `translate(${d.x},${d.y})`); }); // 定义拖拽行为 function drag(simulation) { function dragstarted(event) { if (!event.active) simulation.alphaTarget(0.3).restart(); event.subject.fx = event.subject.x; event.subject.fy = event.subject.y; } function dragged(event) { event.subject.fx = event.x; event.subject.fy = event.y; } function dragended(event) { if (!event.active) simulation.alphaTarget(0); event.subject.fx = null; event.subjectfy = null; } return d3.drag() .on("start", dragstarted) .on("drag", dragged) .on("end", dragended); } </script> </body> </html>
实际运行结果如下。
https://d3js.org/
https://www.tutorialsteacher.com/d3js
https://www.tutorialspoint.com/d3js/index.htm
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。