之一是,變換不上元素本身,但在父母身上。所以它改變了一點邏輯。
下面是針對這種特定情況的解決方案,但您會看到,根據情況它可能會發生變化。例如,如果您更改變換原點,或者如果您有水平排序,則必須對其進行修改。但邏輯保持不變:
var zoomScale = 0.5;
$(".container")
.sortable({
sort: function(e, ui) {
console.log(ui.position.left)
var changeLeft = ui.position.left - ui.originalPosition.left;
// For left position, the problem here is not only the scaling,
// but the transform origin. Since the position is dynamic
// the left coordinate you get from ui.position is not the one
// used by transform origin. You need to adjust so that
// it stays "0", this way the transform will replace it properly
var newLeft = ui.originalPosition.left + changeLeft/zoomScale - ui.item.parent().offset().left;
// For top, it's simpler. Since origin is top,
// no need to adjust the offset. Simply undo the correction
// on the position that transform is doing so that
// it stays with the mouse position
var newTop = ui.position.top/zoomScale;
ui.helper.css({
left: newLeft,
top: newTop
});
}
});
http://jsfiddle.net/aL4ntzsh/5/
編輯:
以前的答案將用於定位工作,但體面半瓶醋如指出,有與驗證時的交叉功能的缺陷應該進行排序。基本上,位置正確計算,但項目保持寬度和高度值,這是不會轉換,這是造成問題。 您可以通過在開始事件中修改這些值來考慮比例因子來調整這些值。像這樣的例子:
start: function(e, ui) {
var items = $(this).data()['ui-sortable'].items;
items.forEach(function(item) {
item.height *= zoomScale;
item.width *= zoomScale;
});
}
http://jsfiddle.net/rgxnup4v/2/
我開始的賞金這個問題。儘管我不一定認爲這個問題廣泛適用於大量的讀者,但是我喜歡看到一個規範的答案,它解決了在可排序的事件處理程序中究竟需要調整什麼,以及爲什麼提出了jQuery可拖動的解決方案在OP的[引用SO問題](https://stackoverflow.com/q/10212683/165154)中,不適用於jquery sortables。 –