我正在尝试为jQueryUI中使用draggable和droppable元素的网站制作工具。
我有一个div
包含元素(draggables)和一个div
元素将被移动到(droppable)。它们是完全独立的div
s,一旦元素被放入droppable div
,它就需要移动到那里。
我的代码适用于移动它,让droppable接受正确的东西,甚至编码以保持可拖动元素只在droppable div
中可拖动。最初将可拖动元素拖到droppable div
时会出现问题。
它保留了包含可拖动元素的原始div
的坐标。因此,当我将它附加到新元素时,它会出现偏移。我可以将它移到droppable div
之后就可以了,并且它可以正常工作,但如果它从一开始就不能存在,那就无济于事。
有没有办法让它转换坐标以匹配droppable div
的坐标,所以它出现在页面的同一位置,但是在DOM上的droppable div
内? / p>
示例:
HTML
<div id="MoveZone" class="Container">
<div id="MoveMe"></div>
</div>
<div style="height: 10px;"></div>
<div id="DropZone" class="Container"></div>
CSS
.Container {
outline-style: solid;
outline-color: black;
outline-width: 3px;
height: 100px;
width: 100px;
}
#MoveMe {
outline-style: solid;
outline-color: blue;
outline-width: 2px;
height: 20px;
width: 20px;
background-color: ghostwhite;
}
的JavaScript
$(document).ready(function () {
$('#MoveMe').draggable({
revert: 'invalid'
});
$('#DropZone').droppable({
accept: '#MoveZone div, #DropZone div',
drop: function (event, ui) {
ui.draggable.detach().appendTo($(this));
ui.draggable.draggable('option', 'containment', 'parent');
}
});
});
我确实找到了一种方法来做到这一点。但它需要在droppable div
的id中进行硬编码...我并不特别喜欢。此外,当它掉落时,它略微偏向左上角,所以即使这样它也不完美,因为如果它被放在左上角,它将部分开箱即用。
编辑:
我能想到的另一种方法是如何计算方框之间的偏移量以及调整drop方法中的位置。但我不确定我会怎么做,特别是因为在我的网站上,可放置点的位置不会是静态的。 (它以页面为中心,因此可能略有移动。)
答案 0 :(得分:2)
我找到了解决问题的解决方案。以下JavaScript是它的作用。
$(document).ready(function () {
$('#MoveMe').draggable({
revert: 'invalid',
cursor: 'move'
});
$('#DropZone').droppable({
accept: '#MoveZone div, #DropZone div',
drop: function (event, ui) {
var parent = ui.draggable.parent();
var draggedElement = $(ui.draggable);
var dropZone = $(this);
var leftOffset = Math.abs(parent.offset().left - dropZone.offset().left);
var topOffset = dropZone.offset().top - parent.offset().top;
draggedElement.detach().appendTo(dropZone);
draggedElement.css('left', draggedElement.position().left - leftOffset);
draggedElement.css('top', draggedElement.position().top - topOffset);
draggedElement.draggable('option', 'containment', 'parent');
}
});
});
基本上,你只是计算两个div
元素之间的偏移量,当它被附加到droppable div
时你将顶部和左侧CSS调整为新的一个。
出于某种原因,它在JSFiddle中不起作用,但确实有效。