D3可折叠树仅拖动而不进行缩放和跳转和滚动

时间:2014-08-21 10:54:17

标签: jquery svg d3.js

D3 Collapsible Tree

编辑: 小提琴添加:http://jsfiddle.net/tLued3x2/2/

我有这个可折叠树,它在点击每个节点时动态扩展。当没有。节点在水平方向上继续增加然后我需要使用D3内置拖动事件添加拖动功能。我从旧的类似问题中获得帮助,包括:

  1. Avoid jumping of an SVG Text with text-anchor while dragging

  2. D3.js Zooming and panning a collapsible tree diagram

  3. 但经过大量搜索和热门试验后,我得到了所需的功能:

     d3.select("svg")
    .call(d3.behavior.drag()
        .origin(function() {
        var t = d3.transform(d3.select(this).attr("transform"));
        return {x: t.translate[0], y: t.translate[1]}})
        .on("drag", dragmove));
    
    function dragmove() {
        var x = d3.event.x;
        var y = d3.event.y;
        d3.select("svg g").attr("transform", "translate(" + x + "," + y + ")");
    }
    

    但是当我尝试拖动树时,这个代码也会从当前鼠标位置跳到帧的最左侧或右侧,并且当树水平深度为8-9个节点时,拖动功能也不会能把我带到极端的节点。

    那么有没有办法控制这种拖动,以便尽可能少地跳跃并平滑拖动到树的末端节点?

    任何帮助都将不胜感激。

    感谢 !!!

1 个答案:

答案 0 :(得分:1)

可以使用jquery-UI可拖动行为来完成此操作。

    $('#div-containing-svg')
      .draggable({axis: "x"})
      .bind('mousedown', function(event, ui){
          $(event.target.parentElement).append( event.target );
      })
     .bind('drag', function(event, ui){
      // update left and top
        event.target.setAttribute('x', ui.position.left);
        event.target.setAttribute('y', ui.position.top);
     });

div-conatining-svg的画布大小也必须能够在拖动时看到。所以大小也必须要控制。