12

我是一名本科生合作社,目前正在为我的团队开发一个网页项目。一开始,我选择使用 dagre-d3 库来构建图形,它们在 Chrome 上运行良好。然后我意识到 SVG 中的 ForeignObject 元素在 IE 上不起作用(它恰好是支持的主要浏览器)。

由于我的目标本质上是在每个图形组件中填充 HTML 内容,我想知道是否有任何解决方法可以在仍然使用 dagre-d3 的 IE 上实现这一点。或者对不同的图形库有什么建议?

更新:

本质上,我想创建如下屏幕截图所示的图形: 示例截图

下面是我现在使用 dagre-d3 构建图形的代码:

HTML 片段:

<div id="graph-section">
    <svg>
        <g transform="translate(20,20)" />
    </svg>
</div>

JS 片段:

var g = new dagreD3.Digraph();

// Construct nodes
for (var i = 0; i < data.nodes.length; i++) {
    var label = "<div class='graphLabel'>";
    label += "<div class='comp" + data.nodes[i].value.type + " left'>&nbsp;</div>";
    label += "<b>&nbsp;" + data.nodes[i].value.name + "</b><br/>";
    label += "<span class='info'>Start: " + data.nodes[i].value.start + "</span><br/>";
    label += "<span class='info'>End: " + data.nodes[i].value.end + "</span><br/>";
    label += "<span class='info'>Launched by " + data.nodes[i].value.user + "</span>";
    label += "</div>";
    g.addNode(data.nodes[i].id, { label: label });
}

// Construct edges
for (var j = 0; j < data.links.length; j++) {
    g.addEdge(null, data.links[j].start, data.links[j].end);
}

var layout = renderer.run(g, d3.select("#graph-section svg g"));
4

2 回答 2

6

我在我的硕士论文项目中大量使用了 SVG foreignObject,这很好,因为它在 Chrome 和 Firefox 中运行良好。但我对该问题的解决方案/解决方法(即 IE 不支持foreignObject)是使用分层布局。我将需要 SVG 的对象放在 SVG 层中,我可以在 HTML 中创建的对象放在 HTML 层中(主要是带有文本的元素,这是 HTML 的“主场”)。

如果您需要许多元素相互叠加,它可能会变得有点复杂,因为 svg 不支持 z-index(它使用元素顺序代替)。所以你可能需要创建多个 HTML/SVG 层来解决这个问题。只需将这些层精确地放在彼此的顶部,协调它们的位置就会变得容易。由于 SVG 对象是基于坐标放置的,因此您可以以相同的方式放置 HTML 元素(例如 by translate(...)

我没有使用dagre-d3,所以如果这个答案离题了,我深表歉意。

于 2014-02-08T15:17:17.587 回答
2

截至 2015 年 4 月 29 日,添加了svg-labels(不使用foreignObject)的功能。

试试这个,而不是你的html-labels.

见演示:http ://cpettitt.github.io/project/dagre-d3/latest/demo/svg-labels.html

见提交:https ://github.com/cpettitt/dagre-d3/pull/158

于 2017-01-04T10:12:29.797 回答