我在模态弹出窗口中有两个可拖动的div,当我拖放时,div的位置在动画期间会下降。我无法将其排序。
HTML
<title>
Swapping of tiles with Animation</title>
<body>
<button type="button" class="btn btn-info btn-lg" data-toggle="modal" data-target="#myModal">Open Modal</button>
<!-- Modal -->
<div id="myModal" class="modal fade" role="dialog">
<div class="modal-dialog">
<!-- Modal content-->
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal">×</button>
<h4 class="modal-title">Modal Header</h4>
</div>
<div class="modal-body">
<p>Some text in the modal.</p>
<div class='droppable'>
<div class="draggable">Draggable 1</div>
</div>
<div class='droppable'>
<div class="draggable">Draggable 2</div>
</div>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
</div>
</div>
</div>
</div>
的JavaScript
$(document).ready(function() {
window.startPos = window.endPos = {};
makeDraggable();
$('.droppable').droppable({
hoverClass: 'hoverClass',
drop: function(event, ui) {
var $from = $(ui.draggable),
$fromParent = $from.parent(),
$to = $(this).children(),
$toParent = $(this);
window.endPos = $to.offset();
swap($from, $from.offset(), window.endPos, 200);
swap($to, window.endPos, window.startPos, 1000, function() {
$toParent.html($from.css({
position: 'relative',
left: '',
top: '',
'z-index': ''
}));
$fromParent.html($to.css({
position: 'relative',
left: '',
top: '',
'z-index': ''
}));
makeDraggable();
});
}
});
function makeDraggable() {
$('.draggable').draggable({
zIndex: 99999,
revert: 'invalid',
start: function(event, ui) {
window.startPos = $(this).offset();
}
});
}
function swap($el, fromPos, toPos, duration, callback) {
$el.css('position', 'absolute')
.css(fromPos)
.animate(toPos, duration, function() {
if (callback) callback();
});
}
});
答案 0 :(得分:5)
如果您已将元素的position
值更改为absolute
并且您想将其置于同一位置,则应使用.position()
代替.offset()
。< / p>
由于您将元素的position
更改为absolute
,因此您正在处理positioned element(即“计算位置属性为relative
的元素,{{ 1}},absolute
或fixed
“)。当您设置定位元素的top
css属性时,您指定“元素的上边距边缘与其包含块的上边缘之间的距离”(不是文档的上边缘)。包含块是最接近的祖先,也是定位元素。 JQuery将包含块称为 offset parent 。
虽然.offset()
函数获取元素“相对于文档”的坐标,但.position()
函数获取“相对于偏移父元素”的坐标。
您要设置动画的元素的偏移父级是具有“modal-body”类的元素。 (它是最接近的祖先,它是一个定位元素。它的sticky
值为position
。)因为.position()
函数,你实际上并不需要确定偏移的父元素。将为你确定。
此jsfiddle与原始jsfiddle相同,但每次调用relative
已被替换为.offset()
的调用。
答案 1 :(得分:0)
将位置从绝对更改为固定。
function swap($el, fromPos, toPos, duration, callback) {
$el.css('position', 'fixed')
.css(fromPos)
.animate(toPos, duration, function() {
if (callback) callback();
});
}
答案 2 :(得分:0)
不确定这是否是您要找的,但这是一个选项(尽管是一个hacky)。
我尝试了解问题的根本原因但却无法解决,因此想到了问题的一个黑客解决方案。 用这个改变你的函数交换。
function swap($el, fromPos, toPos, duration, callback) {
$el.css('position', 'fixed')
.css(fromPos)
.css('margin-top','-10px')
.animate(toPos, duration, function() {
if (callback) callback();
$el.css('margin-top','0px');
});
}
另一个建议是,在第一阶段增加动画持续时间。
像这样swap($from, $from.offset(), window.endPos, 1000);