javascript - 使用 D3 拖动路径

标签 javascript d3.js svg

我有一个例子,我正在创建一个 View Pane ,其“内部”路径。为了给人留下路径在内部的印象,我将它们剪掉。我也希望能够拖动这些路径。通常的建议是使用 SVG transform 属性。但这带来了两个问题:

  • 剪切的路径保持原样,而仅显示部分路径上的拖动
  • 将路径“ float ”到给定 Pane 之外。

完成JSFiddle .

数据是:

var outlines = [
[{ "x": 100.0, "y": 100.0}, {"x": 200.0, "y": 100.0}, {"x": 200.0, "y": 200.0}, {"x": 100.0,"y": 200.0}, {"x": 100.0, "y": 100.0}],
[{ "x": -100.0, "y": 200.0}, {"x": 100.0, "y": 200.0}, {"x": 100.0, "y": 300.0}, {"x": -100.0,"y": 300.0}, {"x": -100.0, "y": 200.0}],
];

我创建这样的路径:

layout
.selectAll('.instance')
.data(outlines)
.enter()
.append('path')
.attr('class', 'instance')
.attr('d', function(d) { return line(d); })
.call(drag);

阻力是:

var drag = d3.behavior.drag()
.origin(function(d) {
  return {
    x: 0,
    y: 0
  };
})
.on("dragstart", function(d) {
  d3.event.sourceEvent.stopPropagation();
})
.on("drag", function(d) {
  d3.select(this)
    .classed("dragging", true)
    .attr('transform', function(d) { return 'translate(' + d3.event.x + ',' + d3.event.y + ')'; });
})
.on("dragend", function(d) {
  d3.select(this)
    .classed("dragging", false)
    .attr('transform', null);
});

我想我想将路径实际移动到新位置。但我不确定如何使用 d3.event 偏移量来操作数据。我怎么做?或者有更好的方法来做到这一点吗?

最佳答案

为了正常工作,transform必须严格位于clip-path内(或者换句话说,如果一个元素有一个clip-path和一个变换属性,然后剪辑路径的坐标就会像对象的其余部分一样移动。

在您的情况下解决此问题的简单方法是将矩形包装在剪辑路径组内:

layout
.selectAll('.instance')
.data(outlines)
.enter()
.append("g")    //this group defines the clipping
.attr("clip-path","url(#clip)")
.append('path') //this path can be moved around
.attr('class', 'instance')
.attr('d', function(d) {
  return line(d);
})
.call(drag)

参见https://jsfiddle.net/xhfcdbb7/

我还删除了对剪辑路径的所有其他引用(这样,无论是否拖动,该组都将剪辑到相同的绝对矩形)

关于javascript - 使用 D3 拖动路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35764038/

相关文章:

javascript - 如何使用 SVG.invent() 创建自定义 svg.js 元素?

android - 我如何给这个 PictureDrawable 着色?

javascript - 使用 angular.js 路由路径时遇到问题

javascript - 菜单悬停子菜单 - 更长的时间

javascript - 如何通过按钮在最近使用的文本框中单击光标插入文本?

javascript - 如何删除 javascript 中的所有点击处理程序

javascript - D3.js:不连续时间尺度(金融数据)

php - 有什么方法可以从网页执行 bash 脚本并在执行时捕获输出吗?

javascript - 向 D3 行添加标签

html - 使用 CSS 悬停时的 SVG 不透明度动画