2010-04-12 14 views
5

sto usando jQuery UI e jQuery draggable, tutti i miei draggables utilizzare jQuery clone aiutante e aggiunge il draggable-droppable.jQuery Draggables e Droppables posizionamento

Ecco il mio codice

$('#squeezePage #droppable').droppable({ 
    tolerance: 'fit', 
    accept: '#squeezeWidgets .squeezeWidget', 
    drop: function(event, ui) { 
    var dropElem = ui.draggable.html(); 

    var clone = $(dropElem).clone(); 

    clone.css('position', 'absolute'); 
    clone.css('top', ui.absolutePosition.top); 
    clone.css('left', ui.absolutePosition.left); 

    $(this).append(clone); 

    $(this).find('.top').remove(); 
    $(this).find('.widgetContent').slideDown('fast'); 

    $(this).find('.widgetContent').draggable({ 
    containment: '#squeezePage #droppable', 
    cursor: 'crosshair', 
    grid: [20, 20], 
    scroll: true, 
    snap: true, 
    snapMode: 'outer', 
    refreshPositions: true 
    }); 

    $(this).find('.widgetContent').resizable({ 
    maxWidth: 560, 
    minHeight: 60, 
    minWidth: 180, 
    grid: 20, 
    }); 
    } 
}); 

sto impostando la posizione del clone con .css('top', ui.absolutePosition.top); e css('left', ui.absolutePosition.left); ma la posizione è relativa al corpo.

La posizione non è relativa al droppable che fa cadere il trascinabile in posizioni casuali. Nel complesso, l'integrazione droppable e trascinabile non è stretta. Voglio renderlo più liscio.

risposta

10

Sto ottenendo l'offset del corpo e sottraendolo dall'offset del clone del widget.

 clone.css('top', ui.position.top - droppableOffset.top); 
     clone.css('left', ui.position.left - droppableOffset.left); 

Funziona!

+1

dove la variabile droppableOffset è jQuery ('# squeezePage #droppable'). Offset(); – Haris

+0

Ho passato così tante ore alla ricerca di una soluzione simile .. grazie mille. –