2

我正在尝试使用 d3 制作一个包含任意数量的矩形和文本元素的块。我设想的方式是将所有内容嵌套在一个 svg 中,并让 svg 可以拖动,而所有内容都随之移动。

但是,每当我将拖动行为附加到元素时,它就会在我移动它时变得模糊。即使我将 ag 嵌套在 svg 和其他所有带有 g 元素的东西中,也会发生这种行为。

这是简化的代码。我有一个主 svg,我在其中插入另一个 svg,我在其中嵌套了一个矩形。

var dragT = d3.select('#test').append('svg').selectAll('svg.test')
    .data([{x:100,y:100}])
    .enter().append('svg')
    .attr('x',100).attr('y',100)
    .style('width',100)
    .call(rectDragBehav).append('g')
    .append('rect').attr('x',100).attr('y',100)
            .attr('width',100).attr('height',100);

var rectDragBehav = d3.behavior.drag()
    .on('drag', rectDragDrag)

function rectDragDrag(d,i) {
    d.x += d3.event.dx;
    d.y += d3.event.dy; console.log(1);
    d3.select(this)
        .attr('x',d.x)
        .attr('y',d.y);//.attr("transform", "translate(" + d.x + "," + d.y + ")");
}

更新:我不知道这意味着什么,但我刚刚发现当你向下滚动以使整个 svg 看不见并向上滚动时,残像消失了。

4

2 回答 2

1

这是一个使用 jsFiddle 的示例。我制作了样本来帮助您,希望对您有所帮助。

的HTML:

<svg height="400" width="600"></svg>

JavaScript:

function onDragDrop(dragHandler, dropHandler) {
    var drag = d3.behavior.drag();

    drag.on("drag", dragHandler).on("dragend", dropHandler);
    return drag;
}

    var g = d3.select("body").select("svg").append("g").data([{ x: 50, y: 50 }]);

    g.append("rect")
      .attr("width", 40)
      .attr("height", 40)
      .attr("stroke", "red")
      .attr("fill","transparent")
      .attr("x", function (d) { return d.x; })
      .attr("y", function (d) { return d.y; })
      .call(onDragDrop(dragmove, dropHandler));

    g.append("text")
      .text("Any Text")
      .attr("x", function (d) { return d.x; })
      .attr("y", function (d) { return d.y; })
      .call(onDragDrop(dragmove, dropHandler));

    function dropHandler(d) {
       // alert('dropped');
    }

    function dragmove(d) {
        d3.select(this)
         .attr("x", d.x = d3.event.x)
         .attr("y", d.y = d3.event.y);
    }
于 2013-04-11T09:25:53.723 回答
1
于 2012-04-12T03:09:50.633 回答