35

I actually have two questions, the on in the title being the main one. I have multiple div elements on the page marked as droppable. Inside these div elements I have spans that are marked as draggable. I want it so when you are dragging an element and it is hovered over a droppable area that area either highlights or has a border so they know they can drop it there.

As secondary question, all my draggable elements have a display:block, a width and a float on them, so they look nice and neat in my droppable areas. When items are dropped they seem to get a position set to them as they no longer float nice and neat like the rest of my items. For reference, here is my javascript.

$('.drag_span').draggable({
    revert: true
});
$('.drop_div').droppable({
    drop: handle_drop_patient
});

function handle_drop_patient(event, ui) {
    $(this).append($(ui.draggable).clone());
    $(ui.draggable).remove();
}
Jhorra
  • 6,233
  • 21
  • 69
  • 123

3 Answers3

49

Check out http://jqueryui.com/demos/droppable/#visual-feedback.

Ex:

$( "#draggable" ).draggable();
$( "#droppable" ).droppable({
    hoverClass: "ui-state-active",
    drop: function( event, ui ) {
        $( this )
            .addClass( "ui-state-highlight" )
            .find( "p" )
                .html( "Dropped!" );
    }
});
$( "#draggable2" ).draggable();
$( "#droppable2" ).droppable({
    accept: "#draggable2",
    activeClass: "ui-state-hover",
    drop: function( event, ui ) {
        $( this )
            .addClass( "ui-state-highlight" )
            .find( "p" )
                .html( "Dropped!" );
    }
});
j08691
  • 204,283
  • 31
  • 260
  • 272
18

This should work for adding a highlight on hover.

$('.drop_div').droppable({
     hoverClass: "highlight",
     drop: handle_drop_patient,
});

Then create a css class for highlight that sets the border or changes the background color or whatever you'd like.

.highlight {
    border: 1px solid yellow;
    background-color:yellow;
}

As far as the position is concerned you can reapply css once the drop is complete.

function handle_drop_patient(event, ui) {
     $(this).append( $(ui.draggable).clone().css({'float':'left','display':'block'}) );
     $(ui.draggable).remove();
}
J. Celestino
  • 372
  • 2
  • 8
  • +1 Thanks for having written "drop: handle_drop_patient". Gratefully, I now know that I can write a single function and put its name there instead of its full implementation such as an anonymous function. – Will Marcouiller Nov 26 '12 at 07:12
11

FYI: hoverClass has been deprecated in favour of classes option. It should now be:

$('.drop_div').droppable({
    classes: {
      'ui-droppable-hover': 'highlight'
    },
    drop: handle_drop_patient
});
Damien Roche
  • 13,189
  • 18
  • 68
  • 96