这是解决拖动的元素对准网格(我在以前的question- Getting jQuery draggable to snap to specific grid概述本)重新定位元素
到目前为止,我已经建立,这个问题该问题的尝试是jQuery在调用.draggable()
时计算元素的位置,并且创建相对于元素的网格,而不是相对于元素的父元素(这会更直观)。
在下面的解决方案,我们看到了3盒:
- 箱1 0,0开出,因此将与父元素的网格对齐。
- 方框2从与网格不对齐的点开始,因此拖动时不会与其对齐。
- 框3也开始在一个点不与网格对齐,但在这种情况下,我们捕捉鼠标向下的事件,并将元素重新定位到最近的网格点,然后才拨打
draggable()
。
只要元素现在将与网格对齐,选项3就起作用。问题是,它需要两个鼠标事件:一个重新定位元素,并且只在下一个mousedown事件中(在变黄之后),实际上会拖动一个拖拽。
我该如何重做此操作以便元素可以被重新定位,然后有.draggable()
调用它,所有与一个单一的mousedown事件?
JS:
$('#box-1').draggable({
grid: [ 20,20 ]
});
$('#box-2').draggable({
grid: [ 20,20 ]
});
var isDraggable = false;
$('#box-3').mousedown(function(e){
console.log('MOUSE DOWN');
if (isDraggable == false) {
var $this = $(this);
// Reposition to nearest grid position:
currentX = parseInt($this.css('left'));
currentY = parseInt($this.css('top'));
nearestGridX = Math.round(currentX/20) * 20;
nearestGridY = Math.round(currentY/20) * 20;
$this.css({left:nearestGridX+'px',top:nearestGridY+'px'});
// Turn yellow:
$this.css({background:'yellow'});
// Make draggable:
isDraggable = true;
$this.draggable({
grid: [ 20,20 ],
start: function(event, ui) {
console.log('START');
}
});
$this.trigger("mousedown");
}
});
多么美丽的问题。一个有趣的问题,对问题的清晰描述,以及完美的小提琴。脱帽致敬。 – Nate
它付出了 - 不能要求更好的答案! – Yarin