【发布时间】:2013-12-20 20:55:17
【问题描述】:
这是一种尝试解决拖动元素对齐网格的问题(我在上一个问题中概述了这一点-Getting jQuery draggable to snap to specific grid)
到目前为止,我已经确定问题在于 jQuery 在调用 .draggable() 时计算元素的位置,并创建相对于元素的网格,而不是相对于元素的父级(这将更直观)。
在以下解决方案中,我们看到 3 个框:
- 框 1 从 0,0 开始,因此将与父元素的网格对齐。
- 框 2 从与网格不对齐的点开始,因此在拖动时永远不会与其对齐。
- 框 3 也是从与网格不对齐的点开始的,但在这种情况下,我们捕获鼠标按下事件,并将元素重新定位到最近的网格点,然后我们调用 @987654325 @。
选项 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");
}
});
【问题讨论】:
-
多么美妙的问题。一个有趣的问题,对问题的清晰描述,以及一个完美设置的小提琴。帽子:关闭。
-
它得到了回报——没有比这更好的答案了!
标签: jquery jquery-ui jquery-ui-draggable