D3 v4 中的可缩放树状图
Zoomable treemap in D3 v4
我正在尝试根据以下示例向 D3 v4 中的树状图添加缩放行为:1 and 2。它是用 HTML 元素构建的,而不是 SVG,我通过使用百分比而不是像素单位使其响应。
到目前为止效果很好,但现在我想通过单击放大到单个单元格,直到到达最后一个子单元格。然后单击将返回到树的根。
到目前为止,这是我的代码:http://codepen.io/znak/pen/qapRkQ
我正在努力使用 V4 中可用的缩放功能,它无处不在:
function zoom(d) {
console.log('clicked: ' + d.data.name);
x.domain([d.x0, d.x1]);
y.domain([d.y0, d.y1]);
var t = d3.transition()
.duration(800)
.ease(d3.easeCubicOut);
chart
.merge(cell)
.transition(t)
.style("left", function(d) { return x(d.x0) + "%"; })
.style("top", function(d) { return y(d.y0) + "%"; })
.style("width", function(d) { return x(d.x1 - d.x0) + "%"; })
.style("height", function(d) { return y(d.y1 - d.y0) + "%"; });
node = d; //?
d3.event.stopPropagation(); //?
}
如何使用 D3 v4 更新和转换元素?
感谢任何提示!
您的问题不是缩放功能,而是 1 级元素位于 2 级元素之前,因此当您单击它时,它会尝试缩放到相同的 1 级元素。
我认为最简单的解决方案是在缩放时分配 class 或使用 pointer-events: none
设置级别 1 元素的样式。这使得无法点击,因此当用户点击它时,它会掉落到 child,然后它将激活缩放。
请务必在重置树时删除 class 或样式!
pointer-events
在除 Opera Mini 之外的所有主要浏览器(Chrome、FF、IE11+)中均受支持。 See browser compatibility on caniuse.com。如果需要支持 11 以下的 IE 或者 Opera Mini,可以修改 z-index
或者隐藏 parent.
本质上,parent阻止了children被选中,所以如果你决定你应该是好的!
经过长时间的休息后,我发现了一个错误 – 错误地放置了括号:
.style("width", function(d) { return x(d.x1 - d.x0) + "%"; })
.style("height", function(d) { return y(d.y1 - d.y0) + "%"; });
应该是:
.style("width", function(d) { return x(d.x1) - x(d.x0) + "%"; })
.style("height", function(d) { return y(d.y1) - y(d.y0) + "%"; });
现在缩放功能正常了。
我正在尝试根据以下示例向 D3 v4 中的树状图添加缩放行为:1 and 2。它是用 HTML 元素构建的,而不是 SVG,我通过使用百分比而不是像素单位使其响应。
到目前为止效果很好,但现在我想通过单击放大到单个单元格,直到到达最后一个子单元格。然后单击将返回到树的根。
到目前为止,这是我的代码:http://codepen.io/znak/pen/qapRkQ
我正在努力使用 V4 中可用的缩放功能,它无处不在:
function zoom(d) {
console.log('clicked: ' + d.data.name);
x.domain([d.x0, d.x1]);
y.domain([d.y0, d.y1]);
var t = d3.transition()
.duration(800)
.ease(d3.easeCubicOut);
chart
.merge(cell)
.transition(t)
.style("left", function(d) { return x(d.x0) + "%"; })
.style("top", function(d) { return y(d.y0) + "%"; })
.style("width", function(d) { return x(d.x1 - d.x0) + "%"; })
.style("height", function(d) { return y(d.y1 - d.y0) + "%"; });
node = d; //?
d3.event.stopPropagation(); //?
}
如何使用 D3 v4 更新和转换元素?
感谢任何提示!
您的问题不是缩放功能,而是 1 级元素位于 2 级元素之前,因此当您单击它时,它会尝试缩放到相同的 1 级元素。
我认为最简单的解决方案是在缩放时分配 class 或使用 pointer-events: none
设置级别 1 元素的样式。这使得无法点击,因此当用户点击它时,它会掉落到 child,然后它将激活缩放。
请务必在重置树时删除 class 或样式!
pointer-events
在除 Opera Mini 之外的所有主要浏览器(Chrome、FF、IE11+)中均受支持。 See browser compatibility on caniuse.com。如果需要支持 11 以下的 IE 或者 Opera Mini,可以修改 z-index
或者隐藏 parent.
本质上,parent阻止了children被选中,所以如果你决定你应该是好的!
经过长时间的休息后,我发现了一个错误 – 错误地放置了括号:
.style("width", function(d) { return x(d.x1 - d.x0) + "%"; })
.style("height", function(d) { return y(d.y1 - d.y0) + "%"; });
应该是:
.style("width", function(d) { return x(d.x1) - x(d.x0) + "%"; })
.style("height", function(d) { return y(d.y1) - y(d.y0) + "%"; });
现在缩放功能正常了。