Эта ссылка содержит отличное описание того, как решить проблему в целом (то есть, не требуя JQuery), и это определенно лучшее решение, которое я видел. Тем не менее, я хотел продолжать использовать превосходный Draggable API JQuery.
Я недавно провел пару дней, пытаясь решить эту проблему. Принятый ответ выше - то, что я попробовал сначала, но я не мог заставить его работать прямо в Firefox. кое-что о том, как браузеры обрабатывают SVG-координаты по-разному.
Я придумал решение, которое довольно хорошо работало для меня, как в Chrome, так и в Firefox, и позволяет мне продолжать использовать пользовательский интерфейс JQuery. Я не проверял это везде. Это определенно хак.
Вы можете увидеть быстрый макет того, что я сделал в скрипке здесь . Основная идея заключается в том, чтобы использовать прокси-элемент div, который вы постоянно удерживаете над элементом svg, который хотите перетащить. Затем вы изменяете координаты x и y элемента svg при перетаскивании прокси-элемента div. Примерно так:
$('#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 над целью. В других ситуациях это может быть намного сложнее. Также не слишком сложно использовать опцию «сдерживание», чтобы убедиться, что вы не перетаскиваете фон за пределы рамки ... это просто требует некоторой тщательной математики и вам необходимо сбросить удерживание между каждым перетаскиванием.
Чтобы сделать это применимым к большему количеству элементов SVG, вы можете использовать преобразования, а не координаты x и y.