これを試して
$(".canvas").droppable({
accept: '.to_drag',
drop: function(event, ui) {
var clone = $(ui.helper).clone();
var parent = $('.canvas.ui-droppable');
$(this).append(clone);
var leftAdjust = clone.position().left - parent.offset().left;
var topAdjust = clone.position().top - parent.offset().top;
clone.css({left: leftAdjust, top: topAdjust});
}
});
基本的には、droppableを相対的なdivで囲むと、droppableで囲まれた要素は、親のオフセット位置を不必要に追加することになります。したがって、dropコールバック関数で余分なオフセットを削除するだけです。
上記のコードを理解するための鍵となる.offset ()と.position( )の違いに細心の注意を払ってください。
注:
私はjsfiddleを使用してみましたが、jsfiddleはポジショニングを少しいじっています。ブラウザだけで試してみてください。動作するはずです。