简体   繁体   English

使用箭头键移动SVG元素

[英]Move SVG Elements with arrow keys

I am dynamically placing svg text elements on a template wrapped in a svg group. 我正在将svg文本元素动态地放在svg组中包装的模板上。 I need the user to have the functionality of moving each element individually with the keyboard arrow keys after it is clicked/focused. 我需要用户具有单击/聚焦后分别使用键盘箭头键移动每个元素的功能。 My current code below has some issue. 我下面的当前代码有问题。 1. The arrow key will move the element once and then I get the error: Unexpected value translate(NaN,undefined) parsing transform attribute. 1.箭头键将元素移动一次,然后出现错误:意外的值translate(NaN,undefined)解析转换属性。 2. If there is more than one element on the canvas, it will move them all and not just the element that was clicked on. 2.如果画布上有多个元素,它将全部移动它们,而不仅仅是被单击的元素。 Any help would be appreciated. 任何帮助,将不胜感激。

$(".svg-canvas").on("click",".selectable",function() {
    var el = $(this).attr("id");
    keymove(el);                
});

function keymove(el) {
$(document).keydown(function(e){
    e.preventDefault(); 
    if(e.keyCode == 39) {//right            
        console.log('right');
        var xforms = $("#" + el).attr("transform");
        var parts  = /\((.*)\)$/.exec(xforms);
        var parts2 = parts[1].split(",");
        var x = parts2[4];
        var y = parts2[5];          
        var tx = (++x);
        $("#" + el).attr({transform:'translate('+ tx + ',' + y +')'});                      
    }else if(e.keyCode == 37) {//left
        console.log('left');
        var xforms = $("#" + el).attr("transform");
        var parts  = /\((.*)\)$/.exec(xforms);
        var parts2 = parts[1].split(",");
        var x = parts2[4];
        var y = parts2[5];
        var tx = (--x);
        $("#" + el).attr({transform:'translate('+ tx + ',' + y +')'});
    }else if(e.keyCode == 38) {//up
        console.log('up');
        var xforms = $("#" + el).attr("transform");
        var parts  = /\((.*)\)$/.exec(xforms);
        var parts2 = parts[1].split(",");
        var x = parts2[4];
        var y = parts2[5];
        var ty = (--y);
        $("#" + el).attr({transform:'translate('+ x + ',' + ty +')'});
    }else if(e.keyCode == 40) {//down
        console.log('down');
        var xforms = $("#" + el).attr("transform");
        var parts  = /\((.*)\)$/.exec(xforms);
        var parts2 = parts[1].split(",");
        var x = parts2[4];
        var y = parts2[5];
        var ty = (++y);
        $("#" + el).attr({transform:'translate('+ x + ',' + ty +')'});
    }else{
        return; 
    }               
});
}

Once you set the transform property to translate.. in here: $("#" + el).attr({transform:'translate('+ tx + ',' + y +')'}); 一旦将transform属性设置为translate..在这里: $("#" + el).attr({transform:'translate('+ tx + ',' + y +')'}); , you can't get the property in matrix mode. ,则无法以matrix模式获取该属性。

So when you are trying to do: var xforms = $("#" + el).attr("transform"); 因此,当您尝试执行以下操作时: var xforms = $("#" + el).attr("transform"); you get translate(236,205) so the parsing is wrong. 您得到了translate(236,205)所以解析是错误的。

The solution is to set the transform values in matrix combination too, so you will can read it in the next action. 解决方案是也以matrix组合设置transform值,因此您可以在下一个动作中读取它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM