Я хочу достичь «панорамирования» в svg, «перетаскивая» элемент в определенном направлении.Pan Svg При перетаскивании элементов
Скажите, что я выбираю элемент и начинаю «перетаскивать» его вверх, пока он не достигнет вершины экрана, теперь мой svg должен автоматически катиться вверх, не вызывая никаких проблем с перетаскиванием. как я могу это достичь.?
Я сделал небольшой макет этого, где пользователь может выбирать и перетаскивать элементы. он также содержит две кнопки, которые заставляют svg перемещаться вверх и вниз. Я получаю «Panning», изменяя «ViewBox» svg. (я должен использовать эту логику, я не могу использовать какое-либо другое решение);
здесь ссылка скрипку: http://jsfiddle.net/9J25r/
Полный код: -
addEventListener('mousedown', mousedown, false);
var mx, my;
var dx, dy;
var mainsvg = document.getElementById('svg');
var selectedElement;
var eleTx, eleTy;
function getSvgCordinates(event) {
var m = mainsvg.getScreenCTM();
var p = mainsvg.createSVGPoint();
var x, y;
x = event.pageX;
y = event.pageY;
p.x = x;
p.y = y;
p = p.matrixTransform(m.inverse());
x = p.x;
y = p.y;
x = parseFloat(x.toFixed(3));
y = parseFloat(y.toFixed(3));
return {x: x, y: y};
}
function mousedown(event) {
if (event.target.id === 'arrow_t') {
panning('up');
}
else if (event.target.id === 'arrow_b') {
panning('down');
}
else if (event.target.id.split('_')[0] === 'rect') {
selectedElement = event.target;
var translatexy = selectedElement.getAttribute('transform');
translatexy = translatexy.split('(');
translatexy = translatexy[1].split(',');
eleTx = translatexy[0];
translatexy = translatexy[1].split(')');
eleTy = translatexy[0];
eleTx = parseFloat(eleTx);
eleTy = parseFloat(eleTy);
var xy = getSvgCordinates(event);
mx = xy.x;
my = xy.y;
mx = parseFloat(mx);
my = parseFloat(my);
addEventListener('mousemove', drag, false);
addEventListener('mouseup', mouseup, false);
}
}
function drag(event) {
var xy = getSvgCordinates(event);
dx = xy.x - mx;
dy = xy.y - my;
selectedElement.setAttribute('transform', 'translate(' + (eleTx + dx) + ',' + (eleTy + dy) + ')');
}
function mouseup(event) {
removeEventListener('mousemove', drag, false);
removeEventListener('mouseup', mouseup, false);
}
function panning(direction) {
var viewBox = svg.getAttribute('viewBox');
viewBox = viewBox.split(' ');
var y = parseFloat(viewBox[1]);
if (direction === 'up')
{
y+=5;
}
else if (direction === 'down')
{
y-=5;
}
viewBox=viewBox[0]+' '+y+' '+viewBox[2]+' '+viewBox[3];
svg.setAttribute('viewBox',viewBox);
}
здесь скрипка ссылка: http://jsfiddle.net/9J25r/
EDIT: - (ДОПОЛНЕНО)
Я использую решение Яна, он хорошо работает на образце, но когда я применил ее к моей первоначальной заявке, это не сработало. проверьте ниже gif. Вы можете увидеть «пробел» между указателем мыши и элементом. как я могу это удалить? ,
тот большой Ян, он хорошо работает, но он не работает на моем самом деле приложение. Я загрузил gif выше, любезно проверьте это. – RashFlash
Трудно сказать, не просматривая код для игры. Это потребует некоторой настройки, когда дело доходит до краев, в зависимости от того, что вы хотите сделать с курсором при перетаскивании прошлых краев. – Ian
Ну, я хочу, чтобы svg сохранял панорамирование, когда курсор и элемент остаются на верхнем краю. Курсор не должен оставлять элемент, и элемент не должен исчезать. – RashFlash