jQuery Sortable and Droppable
Categories:
Mastering jQuery UI Sortable and Droppable for Dynamic Interfaces

Learn how to create interactive drag-and-drop interfaces using jQuery UI's Sortable and Droppable widgets. This guide covers setup, basic implementation, and advanced customization.
jQuery UI provides powerful widgets for enhancing user interfaces, and among the most versatile are Sortable and Droppable. These widgets enable users to interact with elements on a webpage by dragging them, reordering them within lists, or dropping them into designated areas. This article will guide you through the fundamentals of integrating Sortable and Droppable into your web projects, from basic setup to more advanced configurations and event handling.
Getting Started with jQuery UI
Before diving into Sortable and Droppable, ensure you have jQuery and jQuery UI included in your project. You can either download them or use a Content Delivery Network (CDN). It's crucial to include jQuery first, followed by jQuery UI, as jQuery UI depends on the core jQuery library.
<!DOCTYPE html>
<html>
<head>
<title>jQuery UI Sortable & Droppable</title>
<link rel="stylesheet" href="//code.jquery.com/ui/1.13.2/themes/base/jquery-ui.css">
<script src="//code.jquery.com/jquery-3.6.0.js"></script>
<script src="//code.jquery.com/ui/1.13.2/jquery-ui.js"></script>
<style>
#sortable-list, #droppable-area {
border: 1px solid #ccc;
min-height: 50px;
padding: 10px;
margin-top: 10px;
}
#sortable-list li {
background-color: #f9f9f9;
border: 1px solid #ddd;
padding: 8px;
margin-bottom: 5px;
cursor: grab;
}
#droppable-area {
background-color: #e0ffe0;
}
.ui-state-highlight {
height: 1.5em;
line-height: 1.2em;
background-color: #ffffcc;
border: 1px dashed #aaa;
}
.ui-droppable-hover {
background-color: #ccffcc !important;
}
</style>
</head>
<body>
<h1>jQuery UI Sortable & Droppable Example</h1>
<p>Drag items within the list to reorder them, or drag them to the droppable area.</p>
<h2>Sortable List</h2>
<ul id="sortable-list">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
</ul>
<h2>Droppable Area</h2>
<div id="droppable-area">
<p>Drop items here</p>
</div>
<script>
$(function() {
// Sortable initialization
$("#sortable-list").sortable({
placeholder: "ui-state-highlight"
});
$("#sortable-list").disableSelection();
// Droppable initialization
$("#droppable-area").droppable({
accept: "#sortable-list li",
drop: function(event, ui) {
$(this).addClass("ui-state-highlight").find("p").html("Dropped! " + ui.draggable.text());
ui.draggable.remove(); // Remove item from sortable list
},
out: function(event, ui) {
$(this).removeClass("ui-state-highlight").find("p").html("Drop items here");
}
});
});
</script>
</body>
</html>
Basic HTML structure with jQuery UI CDN links and initial Sortable/Droppable setup.
Implementing Sortable Lists
The Sortable widget allows users to reorder items within a list or between connected lists using drag-and-drop. To make an element sortable, you simply call the .sortable()
method on a jQuery selector. You can configure various options to control its behavior, such as placeholder
for visual feedback during dragging, connectWith
to enable sorting between multiple lists, and axis
to restrict movement to horizontal or vertical directions.
flowchart TD A[User Initiates Drag] --> B{Is Element Sortable?} B -- Yes --> C[Placeholder Appears] C --> D{User Moves Element} D --> E{Position Updates Dynamically} E --> F[User Releases Element] F --> G{Element Reordered} B -- No --> H[No Action]
Flowchart illustrating the jQuery UI Sortable process.
$(function() {
$("#sortable-list-one").sortable({
placeholder: "ui-state-highlight",
connectWith: "#sortable-list-two",
update: function(event, ui) {
console.log("List updated! Item: " + ui.item.text());
}
});
$("#sortable-list-two").sortable({
placeholder: "ui-state-highlight",
connectWith: "#sortable-list-one"
});
$("#sortable-list-one, #sortable-list-two").disableSelection();
});
Example of two connected sortable lists with an update
event handler.
.disableSelection()
on sortable elements to prevent text selection issues during dragging, which can interfere with the drag-and-drop experience.Working with Droppable Areas
The Droppable widget allows you to define areas where draggable elements can be dropped. When a draggable element is dropped onto a droppable area, specific events are triggered, enabling you to execute custom logic. Key options include accept
to specify which draggable elements can be dropped, and event handlers like drop
, over
, and out
to respond to user interactions.
$(function() {
$(".draggable-item").draggable({
revert: "invalid", // Draggable reverts if not dropped on a valid droppable
helper: "clone" // Clones the element for dragging, keeping original in place
});
$("#droppable-target").droppable({
accept: ".draggable-item",
hoverClass: "ui-state-hover",
drop: function(event, ui) {
$(this).addClass("ui-state-highlight").find("p").html("Dropped: " + ui.draggable.text());
ui.draggable.remove(); // Remove the original draggable item
},
over: function(event, ui) {
$(this).find("p").html("Ready to drop!");
},
out: function(event, ui) {
$(this).find("p").html("Drop items here");
}
});
});
Configuring a droppable area to accept specific draggable items and handle drop events.
helper: "clone"
with draggable
, remember that ui.draggable
in the drop
event refers to the original element, not the clone. If you want to manipulate the clone, you'll need to handle it differently or use helper: 'original'
.Combining Sortable and Droppable
A common and powerful use case is combining Sortable and Droppable functionalities. For instance, you might have a sortable list where items can also be dragged out and dropped into a separate 'trash' area, or vice-versa. This requires careful configuration of both widgets, especially their connectWith
and accept
options, and handling the drop
event to manage element movement between containers.
graph TD A[Sortable List] --> B{Drag Item} B --> C[Droppable Area] C -- Drop --> D[Process Dropped Item] B --> E[Another Sortable List] E -- Reorder --> A
Diagram showing interaction between Sortable lists and a Droppable area.
The initial example provided at the beginning of this article already demonstrates a basic combination of Sortable and Droppable, where items from a sortable list can be dropped into a separate droppable area and removed from the original list. This pattern is highly flexible and can be adapted for various scenarios, such as building shopping carts, task managers, or dashboard layouts.
receive
event for sortable lists when an item is dropped from another connected sortable list, and the drop
event for droppable areas when an item is dropped from a draggable element.