我已经设置了一个简单的拖放界面来实现克隆功能。我遇到的问题是,当元素被拖动到主画布然后掉落时,它会突然向右移动,而不是准确地拖到我拖动它的位置。
这是javascript:
$(function() {
var x = null;
$("#draggable").draggable({
helper: 'clone',
cursor: 'move',
snap: '.snap-target'
});
$("#canvas").droppable({
drop: function(e, ui) {
if ($(ui.draggable)[0].id != "") {
x = ui.helper.clone();
ui.helper.remove();
x.draggable({
helper: 'original',
containment: '#canvas',
snap: '.snap-target'
});
x.appendTo('#canvas');
}
}
});
});
我创建了一个jsfiddle:
https://jsfiddle.net/kuyn6gmc/
如果您尝试将蓝色框拖动到主画布上,然后释放鼠标,您将看到框如何弹出"稍微向右。当您在画布中移动框时,它可以正常工作。在小提琴上,它没有在浏览器上的全宽时那么糟糕,我认为它相对于视口的总宽度而言。
如果有人知道为什么会这样,我会很感激:)
谢谢 迈克尔
答案 0 :(得分:7)
发生这种情况的原因是因为可拖动元素在被拖动时相对于视口绝对定位。一旦附加了元素,定位就相对于#canvas
元素(因为position: relative
),这就是元素在放下时移动的原因。
正如另一个答案建议的那样,您可以从元素中删除position: relative
,但是,在所有情况下都不会工作。我建议在添加元素之前考虑元素的位置。
例如,您可以减去偏移的上/左定位以及边框的宽度。这样做,#canvas
元素仍然可以相对定位。
var canvasOffset = {
'top': parseInt($(this).offset().top, 10) + parseInt($(this).css('border-top-width'), 10),
'left': parseInt($(this).offset().left, 10) + parseInt($(this).css('border-left-width'), 10)
}
$draggble.css({
"top": parseInt($draggble.css('top'), 10) - canvasOffset.top + 'px',
"left": parseInt($draggble.css('left'), 10) - canvasOffset.left + 'px'
}).appendTo('#canvas');
答案 1 :(得分:3)
您必须将position: relative
添加到body
而不是canvas
。
.draggable { padding: 5px; float: left; margin: 0 10px 10px 0; font-size: .9em; position: relative; }
.small { border: 1px solid slateblue; width: 115px; height: 115px; background: #c5cae9 }
.ui-widget-header p, .ui-widget-content p { margin: 0; }
.text-box { text-align: center; vertical-align: middle; }
body { font-family: 'Helvetica Neue', Helvetica, Arial, serif; font-size: 13px }
#canvas { width: 600px; height: 300px; border: 1px solid #cccccc; margin: auto;
clear: both; }
.draggable-selectors { margin: 10px auto; width: 1000px; }
body { position: relative; margin: 0; }
<body class='snap-target'>