看起来,在Draggable的构造函数中,'grid'选项相对于被拖动元素的原始坐标是有限制的。简单地说,如果您有三个可拖动的
,它们分别相对于其父元素设置了top为100、200、254像素:
问题在于,一旦你拖动了,例如向下,它的顶部就会增加100,移动到354px而不是增加仅仅46px(254 + 46 = 300),这将使它到达网格中的下一个停止点——300px,如果我们将父级div视为参考点和“网格容器”。
我查看了可拖动源代码,似乎存在内置缺陷——它们只是相对于可拖动元素的原始位置进行所有计算。
我希望避免猴子补丁可拖动库的代码,我真正寻找的是让可拖动元素相对于包含父级计算网格位置的方法。然而,如果无法避免猴子补丁,我想我只能接受它。
<div class="parent-div" style="position: relative;">
<div id="div1" class="draggable" style="top: 100px; position: absolute;"></div>
<div id="div2" class="draggable" style="top: 200px; position: absolute;"></div>
<div id="div3" class="draggable" style="top: 254px; position: absolute;"></div>
</div>
所有这些元素都启用了拖拽功能,并将“grid”设置为[1, 100]:
draggables = $('.draggable');
$.each(draggables, function(index, elem) {
$(elem).draggable({
containment: $('#parent-div'),
opacity: 0.7,
revert: 'invalid',
revertDuration: 300,
grid: [1, 100],
refreshPositions: true
});
});
问题在于,一旦你拖动了,例如向下,它的顶部就会增加100,移动到354px而不是增加仅仅46px(254 + 46 = 300),这将使它到达网格中的下一个停止点——300px,如果我们将父级div视为参考点和“网格容器”。
我查看了可拖动源代码,似乎存在内置缺陷——它们只是相对于可拖动元素的原始位置进行所有计算。
我希望避免猴子补丁可拖动库的代码,我真正寻找的是让可拖动元素相对于包含父级计算网格位置的方法。然而,如果无法避免猴子补丁,我想我只能接受它。
ui.position.left = Math.round((ui.position.left - offset) / 100) * 100 + offset
(其中offset
是网格左边框的位置)。 - Milanka