var tmp = 1; $(".droppable").each(function () { $(this).find("p").prepend("<img src='http://placekitten.com/11" + tmp + "/' /><br>"); tmp++; }); function animate($tmpEl,$moveToEl) { var oldTop = $tmpEl.position().top; var oldLeft = $tmpEl.position().left; var newTop = $moveToEl.position().top; var newLeft = $moveToEl.position().left; var $clone; if($tmpEl.data('cloneExists')) { $clone = $tmpEl.data('cloneExists'); $clone.css({backgroundColor: '#ec43ef'}); } else { $clone = $tmpEl.clone().css({ backgroundColor: '#ec43ef', position: 'absolute', top: oldTop, left: oldLeft }).disableSelection(); $tmpEl.parent().append($clone); $tmpEl.data('cloneExists',$clone); $tmpEl.css('visibility', 'hidden'); } $clone.stop().animate({ backgroundColor: '#eee', top: newTop, left: newLeft }, 1000, function () { $clone.remove(); $tmpEl.css('visibility', ''); $tmpEl.data('cloneExists',''); }); } function shiftElTo(el,destEl) { var $el = el.jquery?el:$(el); var $destEl = destEl.jquery?destEl:$(destEl); var elIndex = $el.index(); var destElIndex = $destEl.index(); var dir = destElIndex-elIndex; var max = Math.max(elIndex,destElIndex); var min = Math.min(elIndex,destElIndex); var $childrenArray = $el.parent().children(); //shift all els between el and destEl for(var i = min;i<=max;i++) { var $tmpEl = $childrenArray.eq(i); var index = (dir > 0)?$tmpEl.prev().index():$tmpEl.next().index(); var $moveToEl = $childrenArray.eq(index); if($tmpEl.data('startEl')) { //TODO refactor this section var finalEl = (dir > 0)?$childrenArray.eq(max):$childrenArray.eq(min); $tmpEl.data("draggable").originalPosition = { top : finalEl.position().top, left : finalEl.position().left }; } else { animate($tmpEl,$moveToEl); } } if(dir<0) $el.insertBefore($destEl); else $el.insertAfter($destEl); } $(".droppable").draggable({ zIndex: 10000, revert: true, helper: 'clone', distance: 10, refreshPositions: true, start: function (event, ui) { $(this).data('startEl',true).css('visibility', 'hidden'); }, stop: function (event, ui) { $(this).removeData('startEl').css('visibility', ''); } }).droppable({ tolerance: 'pointer', over: function (event, ui) { shiftElTo(ui.draggable,this); }, out: function (event, ui) { }, drop: function (event, ui) { } }); $('html').disableSelection();
<ul class="sortable"> <li id='0' class="droppable"> <p>Drag me</p></li> <li id='1' class="droppable"> <p>Drag me</p></li> <li id='2' class="droppable"> <p>Drag here</p></li> <li id='3' class="droppable"> <p>Drag me</p></li> <li id='4' class="droppable"> <p>Drag me</p></li> <li id='5' class="droppable"> <p>Drag me</p></li> </ul>
.droppable { width: 150px; height: 150px; padding: 0.5em; float: left; margin: 10px; background-color: #eee; list-style-type: none; } body{ background-color: grey }