2014-07-26 43 views
11

我使用CSS轉換縮放JQuery可排序元素。這兩個可排序的項目開始位置和偏移,而拖動是錯誤的,因爲JQuery不考慮CSS尺度。我解決了這部分的代碼在這裏找到:當應用CSS3縮放比例時,可排序行爲錯誤

jQuery Drag/Resize with CSS Transform Scale

但我解決不了的事情是拖拽開始的排序項位置。它跳起來,一點點。我想不出有什麼投入啓動事件處理程序:

 start: function(e, ui) 
     { 
      // something is needed here to fix the initial offset 
     } 

這小提琴說明問題了: 差異與拖動http://jsfiddle.net/adrianrosca/zbvLp/4/

+0

我開始的賞金這個問題。儘管我不一定認爲這個問題廣泛適用於大量的讀者,但是我喜歡看到一個規範的答案,它解決了在可排序的事件處理程序中究竟需要調整什麼,以及爲什麼提出了jQuery可拖動的解決方案在OP的[引用SO問題](https://stackoverflow.com/q/10212683/165154)中,不適用於jquery sortables。 –

回答

8

之一是,變換不上元素本身,但在父母身上。所以它改變了一點邏輯。

下面是針對這種特定情況的解決方案,但您會看到,根據情況它可能會發生變化。例如,如果您更改變換原點,或者如果您有水平排序,則必須對其進行修改。但邏輯保持不變:

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/

+0

你和[user3765122的回答](https://stackoverflow.com/a/36715198/165154)似乎都可以解決OP的問題,但程度相當。然而,我懷疑是一個微妙的問題,是我自己問題的罪魁禍首,似乎仍然存在於兩者之中:排序檢測被轉移到右邊。如果您在水平中心抓住一個元素並將其拖曳到其他元素上,同時小心地左右移動,您會看到這一點。由於我使用了連接的可分類物,它們的寬度和寬度都比較寬,這個微妙的問題被放大了。你知道如何彌補這個? –

+0

也許我只需要爲我的具體情況開一個新問題,因爲它比OP更復雜,但如果您知道如何解決這個細微問題,我的問題可能會消失。無論如何:因爲你的答案到目前爲止似乎是平等的,所以我不完全確定獎勵獎賞的答案。我可能會決定獎勵這兩個獎金。但是也許你可以解釋爲什麼兩個答案似乎都有相同的結果? PS .:非常感謝您的解決方案! –

+0

好的,非常感謝你的加入!這*確實*解決了OP的問題。不幸的是,它並沒有解決我的情況與我的連接可排序(連接的項目都顯示爲具有'{寬度:0,高度:0,左:0,頂:0}'),但就像我說的,我的情況很多更復雜。所以,要麼我會長時間擺弄它,以便真正嘗試理解位置/偏移/等等的複雜性,否則如果我無法弄清楚它,我會開始一個新的問題。但是賞金是當之無愧的,你給了我很多關於去哪裏尋找的線索。再次感謝! –

1

有你的問題,兩件事情:一個元素的

  1. 位置屬性是基於最近的父計算具有位置是絕對的還是相對的。現在基於父母身體不好,所以你必須爲容器添加position:relative;
  2. 因爲,正如您已經注意到的那樣,當計算ui.positionui.originalPosition時,JQuery不會考慮CSS比例尺,因此您必須將「zoomScale」應用於它們兩者。

CSS

.container 
{ 
    position: relative; 
    transform: scale(0.5); 
    transform-origin: center top; 
} 

腳本

var changeLeft = ui.position.left - ui.originalPosition.left; 
var newLeft = (ui.originalPosition.left + changeLeft)/zoomScale; 
var changeTop = ui.position.top - ui.originalPosition.top; 
var newTop = (ui.originalPosition.top + changeTop)/zoomScale; 

這是更新代碼:http://jsfiddle.net/zbvLp/9/

+0

您和[JulienGrégoire的回答](https://stackoverflow.com/a/36684822/165154)似乎都可以解決OP的問題,同樣也是一個很大的問題。然而,我懷疑是一個微妙的問題,是我自己問題的罪魁禍首,似乎仍然存在於兩者之中:排序檢測被轉移到右邊。如果您在水平中心抓住一個元素並將其拖曳到其他元素上,同時小心地左右移動,您會看到這一點。由於我使用了連接的可分類物,它們的寬度和寬度都比較寬,這個微妙的問題被放大了。你知道如何彌補這個? –

+0

也許我只需要針對自己的具體情況開始一個新問題,因爲它比OP更復雜,但如果您知道如何解決這個細微問題,我的問題可能會消失。無論如何:因爲你的答案到目前爲止似乎是平等的,所以我不完全確定獎勵獎賞的答案。我可能會決定獎勵這兩個獎金。但是也許你可以解釋爲什麼兩個答案似乎都有相同的結果? PS .:非常感謝您的解決方案! –