2013-04-29 5 views
5

Ich habe ein großes Element, das auf dem Bildschirm angezeigt wird, die ich gerne auf einem kleineren Drop-Ziel fallen lassen könnte. Daher möchte ich die Größe des ziehbaren Klons verringern, um der Größe des Drop-Ziels zu entsprechen. Ich dachte, es würde gut aussehen, um das zu animieren. Ich kann nicht scheinen, den kleineren Klon zu bekommen, um während des Ziehens um den Cursor zu zentrieren. Irgendwelche Ideen? Hier ist ein, was ich versucht: http://jsfiddle.net/a3Cj2/Wie mache ich ein JQuery-Draggable mit einem kleineren Klon?

$(".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');  
    } 
}); 

Antwort

8

Einfachster Ansatz bei weitem ist die Verwendung der Option cursorAt mit 'left' und 'top' auf die Hälfte der Dimensionen des geschrumpften Helfer gesetzt.

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

Updated fiddle

+0

Dies ist viel einfacher und macht den Trick. Es hat jedoch nicht den gleichen Effekt, die Bewegung zum Zentrum zu animieren. –

+0

@MikeMarcacci, du hast Recht, der Schrumpfeffekt hier ist weniger attraktiv als in deiner Antwort, obwohl das Nettoergebnis das gleiche ist. Für mich ist der große Vorteil in diesem Ansatz, dass der Helfer nicht mit Margen endet, die später unter Umständen ein Problem darstellen könnten. –

+0

Ja, da stimme ich Ihnen zu. Wenn das Objekt zerstört wird, sobald es gelöscht wird, ist die Verwendung von Margen in Ordnung, aber wenn es danach für immer wieder zu sagen ist, dann ist Ihre Lösung eine viel bessere Idee. –

2

Wow, das mehr Arbeit nahm, als ich dachte! Hier ist das Update:

$(".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');  
    } 
}); 

Sie benötigen für die Veranstaltung Lage Rechnung zu tragen und zentrieren es entsprechend der Differenz zwischen den Zentren beider Größe draggables.

See fiddle here.

+0

Hinweis zu, dass ich die Breiten und Höhen in dort gehalten, so konnte man sehen, was los ist, aber '(300-80)/2 - (300/2 - event.offsetX) 'könnte wirklich zu' event.offsetX-40' vereinfacht werden –