Это было бы намного проще, если бы вы просто использовали jQueryUI .draggable()
. Не требует расположения элементов.
Если вы не хотите использовать этот плагин, то у вас есть правильная идея. Позвольте элементам встать на свои места, а затем рассчитать их положение и установить position: absolute
и все, что left
и top
окажется во время выполнения.
Установите .wall
равным position: relative
. Тогда:
var tPos;
$('.toy').each(function(index) {
tPos = $(this).position();
$(this).css({
left: tPos.left,
top: tPos.top
});
};
$('.toy').css({
position: absolute
});
Высота .wall
и ширина каждого .toy
уменьшаются, когда игрушки абсолютно расположены, но вы можете просто добавить еще несколько строк, чтобы получить / установить их ширину и высоту в вышеупомянутых .each
петлях.
Это, очевидно, не работает, если новые игрушки могут быть добавлены динамически без перезагрузки страницы, как вы предлагаете. Чтобы справиться с этим, вы можете переключить их обратно на position: relative
, добавить новый, получить позицию нового в потоке, затем установить позицию и переключиться обратно на position: absolute
. Любые элементы, которые были перетащены с места, были бы пробелами в потоке, но я не вижу простого способа обойти это.