代码之家  ›  专栏  ›  技术社区  ›  skyfoot

使用JQuery和JQuery SVG可拖动SVG

  •  34
  • skyfoot  · 技术社区  · 16 年前

    我有一个HTML 5页面,在那里我加载了一个svg圆圈。当我点击圆圈时,我会在点击的地方创建另一个小圆圈。我希望能够拖动第二个圆圈,但似乎无法使用jquery ui.draggable()完成;

    我可以通过访问圆的cx和cy属性来移动它,所以必须有一种方法来拖动它。

        <!DOCTYPE HTML> 
    <html >
    <head>
    <title></title>
    <link href="css/reset.css" rel="stylesheet" type="text/css">
    <link href="css/layout.css" rel="stylesheet" type="text/css">
    <link href="css/style.css" rel="stylesheet" type="text/css">
    <script src="js/jquery.js" type="text/javascript" ></script>
    <script src="js/jquerysvg/jquery.svg.js" type="text/javascript" ></script>
    <script src="js/jquery-ui.js" type="text/javascript" ></script>
    <script type="text/javascript" >
    jQuery(document).ready(function(){
        $('#target').svg({onLoad: drawInitial});
        $('circle').click(function(e){
            drawShape(e);
            var shape = this.id;
    
        });
    
        $('.drag').mousedown(function(e){
            var shape = this.id;
            this.setAttribute("cx", e.pageX);
            this.setAttribute("cy", e.pageY);
        });
    })
    
    function drawInitial(svg) {
        svg.add($('#svginline')); 
    }
    
    function drawShape(e) {
        var svg = $("#target").svg('get');
        $('#result').text(e.clientX + ": " +  e.pageX);
        var dragme = svg.circle(e.clientX, e.clientY, 5, {fill: 'green', stroke: 'red', 'stroke-width': 3, class_: 'drag'});    
        //$(dragme).draggable();
    }
    </script>
    </head>
    <body>
        <div id="target" ></div>
        <svg:svg id="svginline">
            <svg:circle id="circ11" class="area" cx="75" cy="75" r="50" stroke="black" stroke-width="2" fill="red"/>
        </svg:svg>
        <div id="result" >ffff</div>
    </body>
    </html>
    
    5 回复  |  直到 16 年前
        1
  •  46
  •   tkdave    15 年前

    jQuery UI的可拖动行为确实有效,但您需要在拖动处理程序中手动更新位置,因为相对CSS定位在SVG中不起作用。

    svg.rect(20,10,100,50, 10, 10, {fill:'#666'});
    svg.rect(40,20,100,50, 10, 10, {fill:'#999'});
    svg.rect(60,30,100,50, 10, 10, {fill:'#ccc'});
    
    $('rect')
      .draggable()
      .bind('mousedown', function(event, ui){
        // bring target to front
        $(event.target.parentElement).append( event.target );
      })
      .bind('drag', function(event, ui){
        // update coordinates manually, since top/left style props don't work on SVG
        event.target.setAttribute('x', ui.position.left);
        event.target.setAttribute('y', ui.position.top);
      });
    
        2
  •  2
  •   Mike    15 年前

        3
  •  2
  •   Community Mohan Dere    9 年前

    This link

    something about how browsers handle

    我提出了一个在Chrome和Firefox中都运行良好的解决方案,并允许我继续使用JQuery UI。我没有在任何地方测试过它。这绝对是一次黑客攻击。

    你可以看到我小提琴演奏的快速模型 here

    $('#proxy').on('drag', function(e)
        {
            t = $('#background');
            prox = $('#proxy');
            t.attr('x', t.attr('x')*1
                       + prox.css('left').slice(0,-2)*1
                       - prox.data('position').left)
                .attr('y', t.attr('y')*1
                          + prox.css('top').slice(0,-2)*1
                          - prox.data('position').top);
            prox.data('position',{top : prox.css('top').slice(0,-2)*1,
                                  left: prox.css('left').slice(0,-2)*1}
                      );
        });
    

    在我的例子中,我想拖动的SVG元素总是会填充屏幕上的某个正方形,所以很容易将代理div定位在目标上。在其他情况下,这可能会困难得多。使用“包含”选项来确保不会将背景拖到框架外也不太难。..它只需要一些仔细的数学计算,你必须重置每次拖动之间的控制。

        4
  •  0
  •   skyfoot    16 年前

    <!DOCTYPE HTML> 
    <html >
    <head>
    <title></title>
    <link href="css/reset.css" rel="stylesheet" type="text/css">
    <link href="css/layout.css" rel="stylesheet" type="text/css">
    <link href="css/style.css" rel="stylesheet" type="text/css">
    <script src="js/jquery.js" type="text/javascript" ></script>
    <script src="js/jquery-ui.js" type="text/javascript" ></script>
    <script src="js/jquerysvg/jquery.svg.js" type="text/javascript" ></script>
    <script src="js/jquerysvg/jquery.svgdom.js" type="text/javascript" ></script>
    
    <script type="text/javascript" >
    jQuery(document).ready(function(){
        $('#target').svg({onLoad: drawInitial});
        $('circle').click(function(e){
            drawShape(e);
            var shape = this.id;
    
        }); 
    })
    
    function drawInitial(svg) {
        svg.add($('#svginline')); 
    }
    
    function onMouseDown(evt){
            //var shape = this.id;
    
            var target = evt.target;        
            target.onmousemove = onMouseMove; 
    
            return false; 
    }
    
    function onMouseMove(evt){
        circle = evt.target
    
        var cx = circle.getAttribute("cx");
        offsetX = $('#target').offset().left;
        offsetY = $('#target').offset().top
        circle.setAttribute("cx", evt.clientX -offsetX);
        circle.setAttribute("cy", evt.clientY - offsetY);
    
        circle.onmouseup = OnMouseUp;
    }
    
    function OnMouseUp(evt) { 
        var target = evt.target;        
        target.onmousemove = null; 
    }
    
    function drawShape(e) {
        var svg = $("#target").svg('get');
        offsetX = $('#target').offset().left;
        offsetY = $('#target').offset().top;
        $('#result').text(e.clientX + ": " +  e.pageX);
        var dragme = svg.circle(e.clientX - offsetX, e.clientY - offsetY, 5, {onmousedown: "onMouseDown(evt)",fill: 'green', stroke: 'red', 'stroke-width': 3});    
        $(dragme).addClass('drag');
    }
    </script>
    </head>
    <body>
        <div id="target" ></div>
        <svg:svg id="svginline">
            <svg:circle id="circ11" class="area" cx="75" cy="75" r="50" stroke="black" stroke-width="2" fill="red"/>
        </svg:svg>
        <div id="result" >ffff</div>
    </body>
    </html>
    
        5
  •  -1
  •   Philippe Perret    7 年前

    只需将svg放入可拖动的div中即可。

    //*
    $(document).ready(function(){
      $('#mydiv').draggable();
    });
    //*/
    <script src="https://code.jquery.com/jquery-1.12.4.js"></script>
    <script src="https://code.jquery.com/ui/1.12.1/jquery-ui.js"></script>
    
    <div id="mydiv">
      <svg xml:lang="en"
        xmlns="http://www.w3.org/2000/svg"
        xmlns:xlink="http://www.w3.org/1999/xlink">
        <text class="main" x="10" transform="rotate(-28 0 0)" y="90">Sol min</text>
        <text class="sous" x="4" y="110" transform="rotate(-28 0 20)">(SOUS DOM.)</text>
       <line stroke="black" stroke-width="2" x1="10" y1="100" x2="110" y2="46" />
       <line stroke="red" stroke-width=2 x1=10 y1=99 x2=10 y2=140 />
     </svg>
    </div>