javascript - 节点展开后树的位置

标签 javascript d3.js svg tree

我最近为一个项目使用了 D3,我面临着树布局的问题。当我最初加载树布局时,它很好地保留在 SVG 中,如下面的屏幕截图所示。 Initial state of tree when no nodes are opened

但是,一旦我开始打开节点,我打开的节点越多,开始上升的节点就越多,因此变得不可见,如下图所示。

当我开始打开节点时: When i start opening nodes 当所有节点都打开时: All of the nodes are opened.

如您所见,我已将 svg 设置为可垂直滚动,以便我可以看到更大的树。

这是我创建树布局的方式:

var tree = d3.layout.tree()
         .nodeSize([55,30]);

现在我找到了一个解决方案,每次我点击一个有子节点的节点时,都会增加包含所有节点的“g”元素的高度,但这不是一个好的解决方案,因为这会导致整棵树“每次发生这种情况时跳”。

//creates the <g> element
var gWidth = 90;
var gHeight = 250;   
var vis = svg.append("g")
            .attr('id', 'group')
            .attr("transform", "translate(" + gWidth + "," + gHeight + ")");


function updateSvg(node){
 //moves the g element 50px down on each click that has a child
                  if(node.children){
                    gHeight +=50;
                    vis.attr("transform", "translate(" + gWidth + "," + gHeight + ")");
                   }
                   else{
                    gHeight-=50;
                    vis.attr("transform", "translate(" + gWidth + "," + gHeight + ")");
                  // }

}

如果有超过一定数量的节点,我也会增加 SVG 高度,但我认为这超出了我当前问题的范围。

有什么我想念的吗?

最佳答案

我可以看到两种尝试解决此问题的方法:

<强>1。在您的解决方案中使用 gHeight 变量自动滚动您的容器以避免跳跃:

  document.getElementById("container").scrollTop += 50;

虽然我真的不确定这一点,所以我认为你会做得更好:

<强>2。使用 d3 缩放和平移方法缩放行为效果很好,请参见

https://github.com/mbostock/d3/wiki/Zoom-Behavior

归结为

var zoom = d3.behavior.zoom();
svg.call(zoom);

因此您可以摆脱滚动条和 gHeight,基本上不必再担心窗口边界了。

关于javascript - 节点展开后树的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35574140/

相关文章:

javascript - JS过滤数组根据条件去除重复值

javascript - 删除初始化时的 d3 轴过渡

html - d在svg路径中是什么意思?

javascript - 在 svg 中添加图像

jquery - CSS 水平滚动溢出与 jQuery slider

javascript - 如何在MVC上通过Kendo UI导出Excel?

javascript - 使用 canvg 将 C3.js SVG 可视化到 Canvas - 折线图填充黑色矩形, "ERROR: Element ' parsererror' 尚未实现”

css - 修复了滚动 Flex 元素中的 SVG 位置

javascript - 单击背景时防止隐藏自定义模式

d3.js - 在 Power Bi 中迁移 D3.js 报告?