2014-07-26 11 views
11

Tôi đang chia tỷ lệ phần tử có thể sắp xếp JQuery với chuyển đổi CSS. Cả hai mục có thể sắp xếp bắt đầu vị trí và bù trong khi kéo là sai beacuse JQuery không xem xét quy mô CSS. Tôi giải quyết nó một phần với mã tìm thấy ở đây:Có thể sắp xếp hoạt động sai khi quy mô CSS3 được áp dụng

jQuery Drag/Resize with CSS Transform Scale

Nhưng điều tôi không thể giải quyết là vị trí mục sắp xếp được ở bắt đầu kéo. Nó nhảy lên và phải một chút. Tôi không thể tìm ra những gì để đưa vào xử lý sự kiện bắt đầu:

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

Fiddle này cho thấy vấn đề: http://jsfiddle.net/adrianrosca/zbvLp/4/

+0

tôi bắt đầu một bounty cho câu hỏi này.Mặc dù tôi không nhất thiết nghĩ rằng câu hỏi này được áp dụng rộng rãi cho một lượng lớn khán giả, tôi * làm * thích xem câu trả lời chính xác để điều chỉnh chính xác những gì cần được điều chỉnh trong các trình xử lý sự kiện có thể sắp xếp và tại sao giải pháp có thể kéo được trong [câu hỏi SO được tham chiếu] của OP (https://stackoverflow.com/q/10212683/165154), không áp dụng cho các sắp xếp jquery. –

Trả lời

8

Một khác biệt với kéochuyển không nằm trên bản thân các yếu tố, nhưng trên phụ huynh. Vì vậy, nó thay đổi một chút logic.

Đây là giải pháp cho trường hợp cụ thể này, nhưng bạn sẽ thấy tùy thuộc vào tình huống có thể thay đổi. Ví dụ: nếu bạn thay đổi chuyển đổi nguồn gốc hoặc nếu bạn có thể sắp xếp theo chiều ngang, nó sẽ phải được điều chỉnh. Nhưng logic vẫn như cũ:

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/

EDIT:

câu trả lời trước sẽ làm việc cho vị trí, nhưng khi được trỏ bởi Dabbler Decent, có một lỗ hổng với chức năng ngã tư mà xác nhận khi một phân loại nên xảy ra. Về cơ bản, các vị trí được tính toán chính xác, nhưng các mục giữ cho các chiều cao chiều rộngchiều cao giá trị không được chuyển đổi gây ra sự cố. Bạn có thể điều chỉnh các giá trị này bằng cách sửa đổi chúng trên sự kiện bắt đầu để tính đến yếu tố tỷ lệ. Như thế này ví dụ:

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

Cả câu trả lời của bạn và của [user3765122] (https://stackoverflow.com/a/36715198/165154) dường như giải quyết vấn đề của OP, ở mức độ lớn như nhau. Tuy nhiên, một vấn đề tinh tế, mà tôi nghi ngờ là thủ phạm cho vấn đề của riêng tôi, dường như vẫn còn trong cả hai: phát hiện sắp xếp được chuyển sang bên phải. Nếu bạn lấy một phần tử ở trung tâm nằm ngang và kéo nó qua người khác, trong khi cẩn thận dịch chuyển sang trái và phải, bạn sẽ thấy điều này. Vì tôi sử dụng các thiết bị có thể kết nối, chúng cũng rộng hơn * và * anh chị em ngang, vấn đề tinh tế này cực kỳ phóng đại. Bạn có biết cách bù đắp cho điều này không? –

+0

Có lẽ tôi sẽ phải bắt đầu một câu hỏi mới cho trường hợp cụ thể của tôi, vì nó phức tạp hơn nhiều so với OP, nhưng vấn đề của tôi có thể biến mất nếu bạn biết cách khắc phục vấn đề tinh tế này. Trong mọi trường hợp: vì cả hai câu trả lời của bạn xuất hiện để được trên một chân bằng nhau cho đến nay, tôi không hoàn toàn chắc chắn câu trả lời để giải thưởng tiền thưởng được nêu ra. Tôi có thể quyết định trao tiền thưởng cho cả hai. Nhưng có lẽ bạn có thể giải thích tại sao cả hai câu trả lời đều có kết quả giống nhau? PS: Cảm ơn bạn rất nhiều vì giải pháp của bạn cho đến nay! –

+0

Được rồi, cảm ơn bạn rất nhiều vì đã bổ sung! Điều này * không * giải quyết vấn đề cho trường hợp của OP. Thật không may nó không giải quyết trường hợp của tôi với các thiết bị có thể kết nối của tôi (các mục được kết nối đều có '{width: 0, height: 0, left: 0, top: 0}'), nhưng như tôi đã nói, trường hợp của tôi là nhiều phức tạp hơn. Vì vậy, hoặc là tôi sẽ fiddle với nó một số còn bản thân mình để thực sự cố gắng hiểu được phức tạp của vị trí/offsets/etc, hoặc tôi sẽ bắt đầu một câu hỏi mới về nó nếu tôi không thể tìm ra nó. Nhưng tiền thưởng là xứng đáng, và bạn đã cho tôi rất nhiều manh mối về nơi để tìm kiếm. Cảm ơn một lần nữa! –

1

Có hai điều trong vấn đề của bạn: tài sản

  1. Vị trí của một nguyên tố được tính toán dựa vào cha mẹ gần trong đó có vị trí là tuyệt đối hay tương đối. Ngay bây giờ dựa trên cha mẹ là cơ thể mà không phải là tốt, do đó bạn phải thêm position:relative; cho container.
  2. Bởi vì, như bạn đã nhận thấy, JQuery không xem xét cân nhắc CSS khi tính cả hai số ui.positionui.originalPosition để bạn phải "áp dụng" zoomScale cho cả hai.

CSS

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

Script

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; 

Đây là mã cập nhật: http://jsfiddle.net/zbvLp/9/

+0

Cả câu trả lời của bạn và [Julien Grégoire] (https://stackoverflow.com/a/36684822/165154) dường như giải quyết vấn đề của OP, ở mức độ lớn như nhau. Tuy nhiên, một vấn đề tinh tế, mà tôi nghi ngờ là thủ phạm cho vấn đề của riêng tôi, dường như vẫn còn trong cả hai: phát hiện sắp xếp được chuyển sang bên phải. Nếu bạn lấy một phần tử ở trung tâm nằm ngang và kéo nó qua người khác, trong khi cẩn thận dịch chuyển sang trái và phải, bạn sẽ thấy điều này. Vì tôi sử dụng các thiết bị có thể kết nối, chúng cũng rộng hơn * và * anh chị em ngang, vấn đề tinh tế này cực kỳ phóng đại. Bạn có biết cách bù đắp cho điều này không? –

+0

Có lẽ tôi sẽ phải bắt đầu một câu hỏi mới cho trường hợp cụ thể của tôi, vì nó phức tạp hơn nhiều so với OP, nhưng vấn đề của tôi có thể biến mất nếu bạn biết cách khắc phục vấn đề tinh tế này. Trong mọi trường hợp: vì cả hai câu trả lời của bạn xuất hiện để được trên một chân bằng nhau cho đến nay, tôi không hoàn toàn chắc chắn câu trả lời để giải thưởng tiền thưởng được nêu ra. Tôi có thể quyết định trao tiền thưởng cho cả hai. Nhưng có lẽ bạn có thể giải thích tại sao cả hai câu trả lời đều có kết quả giống nhau? PS: Cảm ơn bạn rất nhiều vì giải pháp của bạn cho đến nay! –

Các vấn đề liên quan