2013-04-29 11 views
5

Mam duży element, który jest wyświetlany na ekranie, który chciałbym upuścić na mniejszy cel upuszczenia. Dlatego chcę zmniejszyć rozmiar klonu, który można przeciągnąć, aby dopasować go do rozmiaru celu upuszczenia. Pomyślałem, że byłoby dobrze to animować. Wydaje mi się, że mniejszy klon nie może się skupić wokół kursora podczas przeciągania. Jakieś pomysły? Oto, co starałem: http://jsfiddle.net/a3Cj2/Jak utworzyć narzędzie JQuery do przeciągnięcia za pomocą mniejszego klonu?

$(".draggable").draggable({ 
    helper: 'clone', 
    start : function(event, ui){ 
     ui.helper.animate({ 
      width: 80, 
      height: 50 
     }); 
    }, 
    drag : function(event, ui){ 
     ui.helper.offset({ 
      left: event.pageX, 
      top: event.pageY 
     }); 
    } 
}); 

$("#target").droppable({ 
    drop : function(event, ui) { 
     console.log('dropped');  
    } 
}); 

Odpowiedz

8

Najprostszym podejściem jest użycie opcji cursorAt z ustawieniem "lewo" i "góra" do połowy wymiarów skurczonego pomocnika.

$(".draggable").draggable({ 
    helper: 'clone', 
    start: function (e, ui) { 
     ui.helper.animate({ 
      width: 80, 
      height: 50 
     }); 
    }, 
    cursorAt: {left:40, top:25} 
}); 

Updated fiddle

+0

Jest to o wiele prostsze i działa. Nie ma jednak takiego samego efektu animowania ruchu w centrum. –

+0

@MikeMarcacci, masz rację, efekt kurczenia się jest mniej atrakcyjny niż w twojej odpowiedzi, chociaż wynik netto jest taki sam. Dla mnie dużą zaletą tego podejścia jest to, że pomocnik nie kończy się marżami, które w pewnych okolicznościach mogą być problemem. –

+0

Tak, zgadzam się z tobą w tej sprawie. Jeśli obiekt zostanie zniszczony po upuszczeniu, użycie marginesów jest w porządku, ale jeśli ma się powiedzieć za każdym razem, to twoje rozwiązanie jest o wiele lepszym pomysłem. –

2

Wow, która miała więcej pracy niż myślałem! Oto poprawka:

$(".draggable").draggable({ 
    helper: 'clone', 
    start : function(event, ui){ 
     ui.helper.animate({ 
      width: 80, 
      height: 50, 
      marginLeft: (300-80)/2 - (300/2 - event.offsetX), 
      marginTop: (200-50)/2 - (200/2 - event.offsetY) 
     }); 
    }, 
    drag : function(event, ui){ 

    } 
}); 

$("#target").droppable({ 
    drop : function(event, ui) { 
     console.log('dropped');  
    } 
}); 

Należy uwzględnić położenie zdarzenia i wyśrodkować je zgodnie z różnicą między środkami obu wielkości urządzeń przeciągających.

See fiddle here.

+0

Uwaga zbyt że trzymałem szerokości i wysokości w środku więc można zobaczyć, co się dzieje, ale '(300-80)/2 - (300/2 - event.offsetX) 'naprawdę można uprościć do' event.offsetX-40' –