如果不添加重复逻辑,我没有找到任何可能的解决方案(可拖动插件中已经存在定位算法,但我无法强制插件执行它)。
所以我添加了下一个代码来更新项目位置:
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'));