重複したロジックを追加せずに可能な解決策は見つかりませんでした (配置アルゴリズムはドラッグ可能なプラグインに既に存在しますが、プラグインに強制的に実行させることはできません)。
だから私はアイテムの位置を更新するために次のコードを追加しました:
function updateItemPosition(item, container)
{
var itemRect = getRect(item), currentPosition = item.position(),
position = getItemPosition(getRect(container), itemRect);
item.css('top', position.top - itemRect.top + currentPosition.top + 'px')
.css('left', position.left - itemRect.left + currentPosition.left + 'px');
}
function getRect(target)
{
var result = target.offset();
result.width = target.outerWidth();
result.height = target.outerHeight();
return result;
}
function getItemPosition(containerRect, itemRect)
{
var result = {};
result.top = Math.max(containerRect.top, Math.min(containerRect.top + containerRect.height - itemRect.height, itemRect.top));
result.left = Math.max(containerRect.left, Math.min(containerRect.left + containerRect.width - itemRect.width, itemRect.left));
return result;
}
そして、次のように使用する必要があります。
updateItemPosition($('.item'), $('.placeholder'));