2013-11-23 20 views
2

Я сделал элементы перетаскивать на прямой путь, и крепится к оси перед использованием JQuery UI, например, так:Сделать элемент перетаскиваемым по диагонали/на пути

$('#element').draggable({ 
    axis:'y' 
}); 

Однако, я задаюсь вопросом, как сделать элемент перетаскивается, следуя определенному пути, который по существу является перетаскиваемой линией.

У меня в основном есть один стиль/позиция элемента в начале и другой стиль/позиция его конечного местоположения, и я хочу, чтобы он перетаскивался по пути между этими двумя позициями.

Как это сделать с помощью javascript или jQuery?

+0

Вы, возможно, придется сделать это проверка х, у вручную (вручную, я имею в виду написать собственный кода) вместо использования методов jQuery UI. –

+0

@Derek 朕 會 功夫 О, ладно. Это кажется неэффективным, хотя, проверяя положение для каждого пикселя, который он перемещает. Есть ли способ, который я могу сказать, если он вдоль линии, тогда пусть он будет перетаскиваться по этой линии. –

+0

Честно говоря, я не думаю, что будет большая разница в производительности, поскольку jQuery делает то же самое, чтобы проверить, находятся ли ваши координаты внутри определенного диапазона. Насколько я знаю, это единственное, что нужно сделать. [Это] (https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm) может помочь вам, если вы хотите найти каждый пиксель между ними. –

ответ

5

Я не думаю, что jQuery предоставляет такую ​​функциональность. Тем не менее, вы можете сделать это в чистом JavaScript, или использовать этот плагин, который я сделал:

$.fn.dragBetween = function(eles) { 
    var dragEle = this, 
     md = false, offset, a, b, ab; 
    eles[0] = $(eles[0])[0]; 
    eles[1] = $(eles[1])[0]; 
    dragEle.on("mousedown", function(e) { 
     if (e.which == 1) { 
      mD = true; 
      offset = new Vector(
       e.clientX - this.offsetLeft, 
       e.clientY - this.offsetTop 
      ); 
      a = new Vector(eles[0].offsetLeft, eles[0].offsetTop); 
      b = new Vector(eles[1].offsetLeft, eles[1].offsetTop); 
      ab = b.sub(a); 
     } 
    }); 
    $(window).on("mousemove", function(e) { 
     if (!mD) return false; 

     var cursor = new Vector(e.clientX, e.clientY).sub(offset).sub(a), 
      mag = cursor.dot(ab)/ab.dot(ab), 
      proj = ab.times(Math.max(0, Math.min(1, mag))); 
     var final = proj.add(a); 
     dragEle.css({ 
      top: final._arr[1], 
      left: final._arr[0] 
     }); 
     e.preventDefault(); 
    }).mouseup(function() { 
     mD = false; 
    }); 
}; 

И это Vector класс я писал в спешке:

function Vector(x, y) { 
    this._arr = [x, y]; 
} 
Vector.prototype.dot = function(v2) { 
    var v1 = this; 
    return v1._arr[0] * v2._arr[0] + v1._arr[1] * v2._arr[1]; 
} 
Vector.prototype.add = function(v2) { 
    var v1 = this; 
    return new Vector(v1._arr[0] + v2._arr[0], v1._arr[1] + v2._arr[1]); 
} 
Vector.prototype.sub = function(v2) { 
    var v1 = this; 
    return new Vector(v1._arr[0] - v2._arr[0], v1._arr[1] - v2._arr[1]); 
} 
Vector.prototype.times = function(n) { 
    var v = this; 
    return new Vector(v._arr[0] * n, v._arr[1] * n); 
} 

назвать, просто сделать:

$("#drag").dragBetween(["#a", "#b"]); 

Демо: http://jsfiddle.net/DerekL/0j6e60d8/
Для формулы объяснения, см: https://www.desmos.com/calculator/tpegbbk8gt

+1

Это прекрасно, спасибо! –

+0

Несовершенно, потому что он терпит неудачу, если 'x1 == x2' или' y1 == y2' – yckart

+0

@yckart - Dang. Я думал, что могу уйти с простой алгеброй, но мне кажется, что мне придется делать это с векторной проекцией. –

0

Я не мог использовать ответ Дерека, потому что вы потеряли другие функции, которые jquery ui draggable обеспечивает как сдерживание.

я нашел, чтобы сделать его перетащите курсор по диагонали, вы можете изменить CSS, используя событие перетаскивания, как это:

$(".leftTopCircle").draggable({ axis:"x", containment: ".topLeft", scroll: false }); 
$(".leftTopCircle").on("drag", function(event, ui){ 
    $(this).css("top", ui.position.left+"px"); 
}); 
+0

Привет, Брюс, можете ли вы предоставить html или, может быть, скрипку, чтобы показать, как ваш код может работать? Нужно это тоже. Благодаря! – Garavani

Смежные вопросы