javascript - 如何修复集群捆绑图中的缩放和平移?

标签 javascript d3.js svg zooming drag

我使用一些数据创建了一个分层边缘捆绑图,在尝试在图表上实现缩放和拖动后,我遇到了一些问题。

这是我迄今为止所拥有的类似的工作jsfiddle:https://jsfiddle.net/hnjvxd48/1/

以及相关代码:

var zoom = d3.behavior.zoom()
    .scaleExtent([0,8])
    .on("zoom", zoomhandler);

var drag = d3.behavior.drag()
    .origin(function(d) { return d; })
    .on("dragstart", dragstarted)
    .on("drag", dragged)
    .on("dragend", dragended);

var svg = d3.select(".container").append("svg")
.attr("width", diameter)
.attr("height", diameter)
.append("g")
.attr("transform", "translate(" + radius + "," + radius + ")")
.call(zoom)
.call(drag);

function zoomhandler(){
    svg.attr("transform", "translate(" + d3.event.translate + ")scale(" + d3.event.scale + ")");
}
function dragstarted(d) {
  d3.event.sourceEvent.stopPropagation();
  d3.select(this).classed("dragging", true);
}

function dragged(d) {
  d3.select(this).attr("cx", d.x = d3.event.x).attr("cy", d.y = d3.event.y);
}

function dragended(d) {
  d3.select(this).classed("dragging", false);
}

你会注意到:

1) 拖动和缩放仅发生在图形的外边缘,而不发生在图形的内部。

2) 拖动图形会导致图形闪烁、中心位置发生变化并被切断。

3) 缩放(通过鼠标滚轮完成)也会错误地使图形居中,并将其放置在不可预测的位置,部分位于视口(viewport)之外。

4) 图形缩小后尝试拖动图形会导致图形闪烁并消失。

是什么导致了这些问题以及如何解决这些问题?如何为我的图表(比我提供的示例大得多)提供最初的“缩小”状态,并可能使用按钮单击事件而不是 native 滚轮实现来触发缩放功能?

最佳答案

这里需要注意的一件大事是拖动功能实际上是多余的。在这个 ( http://bl.ocks.org/mbostock/6123708 ) d3 拖动 + 缩放示例中,它们用于移动单个“点”。您想要一次移动整个图表,这是由您所包含的“zoomhandler”函数的“translate”部分处理的。

这是一个工作 fiddle :https://jsfiddle.net/14f9f4k3/1/

以及注释中注明的更改的关键代码:

var zoom = d3.behavior.zoom()
    .scaleExtent([0,8])
    .on("zoom", zoomhandler);

//added another group as a child of the group having zoom called on it w/ id 'draggroup' to append nodes and links to 
var svg = d3.select(".container").append("svg")
    .attr("width", diameter)
    .attr("height", diameter)
    .append("g")
    .attr("transform", "translate(" + radius + "," + radius + ")")
    .call(zoom)
    .append('g')
    .attr('id','draggroup');

//added a rect behind the other elements to make an easy target for the pointer
d3.select('#draggroup')
    .append('rect')
    .attr("transform", "translate(" + -radius + "," + -radius + ")")
    .attr('width',diameter)
    .attr('height',diameter)
    .attr('fill','#fff');

//no need for separate drag functions, translate and scale here do what you want
function zoomhandler(){
    svg.attr("transform", "translate(" + d3.event.translate + ") scale(" + d3.event.scale + ")");
  }

//append the links and nodes to the group we created above instead of the base svg
var link = d3.select('#draggroup').append("g").selectAll(".link"),
    node = d3.select('#draggroup').append("g").selectAll(".node");

关于javascript - 如何修复集群捆绑图中的缩放和平移?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35443768/

相关文章:

javascript - 如何使用 recompose hocs 测试 React 组件

javascript - Term.js - 页面向下滚动到带有终端的部分

d3.js - 如何运行 D3 示例

javascript - D3.js - 在页面上重新定位圆环图

javascript - D3 在 X 轴上平移直线时,沿 mousemove 中断的路径移动圆

javascript - 视差、带有 SVG 的 javascript?是对的吗?

javascript - 如何在文本区域中只允许退格和移动

javascript - 如何防止 Dynamics CRM 2015 在线索合格时创建机会?

d3.js - 如何在 d3 工具的强制布局中可视化 mysql 数据库中的数据

javascript - 使用 JavaScript 将 svg 导出为 png 或其他具有样式的图像