jQuery UI Library

Sortable

Syntax#

  • $(“#sortable”).sortable({ /*Options Here*/ }); //Initialise Sortable

  • $(“#sortable”).sortable(“option”, “option_name”, option_value); //Set option outside initialiser

  • var value = $(“#sortable”).sortable(“option”, “option_name”); //Gets the value of an option

Parameters#

Parameter Description
Options  
appendTo (jQuery, Element, Selector, String) [Default: “parent”] The element that the helper is added to
axis (String) [Default: false] The directions that the item can be dragged (x or y)
cancel (Selector) [Default: “input,textarea,button,select,option”] Doesnt start sorting if you start on an element matching the selector
classes (Object) [Default: {}] Specify additional classes to add to the sortables elements when the structural classes are added. ({ui-sortable-helper: custom_class})
connectWith (Selector) [Default: false] Allows to items from one sortable to be dragged to another
containment (Element, Selector, String) [Default: false] The element that items are constrained to
cursor (String) [Default: “auto”] Defines the type of cursor to be shown when sorting
cursorAt (Object) [Default: false] Defines the position that the helper looks like its being moved from
disabled (Boolean) [Default: false] Disables the sorting if true
dropOnEmpty (Boolean) [Default: true] If false items from this sortable can not be placed in empty sortables
forceHelperSize (Boolean) [Default: false] Forces the helper to have a size
forcePlaceholderSize (Boolean) [Default: false] Forces the placeholder to have a size
grid (Array) [Default: false] Defines a grid to snap the helper to ([ x,y ])
handle (Selector, Element) [Default: false] Defines elements that sorting can start on. Opposite to cancel
helper (String, Function) [Default: “original”] String “original” or “clone”, or function that returns the element to be used as the helper.
items (Selector) [Default: ”> *”] Defines the items that should be sortable
opacity (Number 0.01 to 1) [Default: false] Defines the opacity for the helper
placeholder (String) [Default: false] Defines a class or classes to be applied to the placeholder
revert (Boolean, Number) [Default: false] The time that it takes the helper to slide into its new position
scroll (Boolean) [Default: true] Whether to scroll when at edges of the page
scrollSensitivity (Number) [Default: 20] Defines how close to the edge of the page the cursor needs to be to start scrolling
scrollSpeed (Number) [Default: 20] The speed at which to scroll
tolerance (String) [Default: “intersect”] Defines which mode to use when calculating when one item is over another (“intersect” or “pointer”)
zIndex (Integer) [Default: 1000] Defines the z-index of the helper when sorting
Methods  
cancel() Cancels the current sort and returns the elements back to their position before the sort started
destroy() Removes the sortable functionality and returns the element to its state pre initialisation
disable() Disables the sortable
enable() Enables the sortable
instance() Returns the sortables instance object
option() Gets key value pairs of all the options for the sortable
option(String) Gets the value of an option
option(String, Any) Sets the value of the option specified by the String
option(Object) Sets one or more options with the object being key value pairs of options
refresh() Refreshes the sortable options reloading all sortable items. This causes new items to be recognised
refreshPositions() Rrefreses the cached positions of the sortable items
serialize(Object) Serializes the items ids (by default) into a string that can be submitted or appended to a url Object options: {key: sets the key in the serialized string, attribute:[Default “id”] sets the attribute to look at, expression:[Default: ”/(.+)-=_/”] regex to split the attribute in to key value pairs}
toArray(Object) Serializes the sortable items id into an array. The object can contain a parameter attribute which has the attribute to put into the array default is id
widget() Returns a jQuery object of the sortable element
Events  
activate(event, ui) Triggered when connected list, every connected list on drag start receives it
beforeStop(event, ui) Triggers before sorting stops when the helper has being shiftered to the same position as the placeholder
change(event, ui) Triggered when elements change position ie. when the placeholder moves
create(event, ui) Triggered when sortable is created
deactivate(event, ui) Triggered when sorting stops. This goes to all connected lists as well
out(event, ui) Triggered when the item is moved out of the sortable list
over(event, ui) Triggered when the item is moved into a sortable list
receive(event, ui) Triggered when an item from a connected list has being dropped into another one. Target is the receiving list
remove(event, ui) Triggered when an item from a connected list has being dropped into another one. Target is the giving list
sort(event, ui) Triggered during sorting
start(event, ui) Triggered when sorting starts
stop(event, ui) Triggered when sorting stops
update(event, ui) Triggered when sorting stops and the DOM position has being updated

Remarks#

Official Documentation here

Simple Example

Take any list and add an identifier to the outer wrapper (ul, div)

<ul id="sortable">
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
<li>Item 4</li>
</ul>

In your jquery:

$(function(){
    $('#sortable').sortable({
        //pass all options in here
    });
});

This will allow all the li in the #sortable wrapper to be dragged and dropped in the list

Sortable Grid with flex layout

This used the flex layout with the sortable to create a grid of responsive boxes that can be moved around by dragging and dropping.

HTML

<div id="sortable">
  <div>1</div>
  <div>2</div>
  <div>3</div>
  <div>4</div>
  <div>5</div>
</div> 

JS

$(function(){
    $('#sortable').sortable({
        //pass all options in here
    });
});

CSS

#sortable{
    width: 500px;
    display: flex;
    flex-wrap: wrap;
}
#sortable div {
    margin: 10px;
    background-color: #f00;
    flex-basis: 100px;
    height: 100px;
}

Stationary Items when dragging

This example uses a class on the placeholder to turn it into a line and make it take up no room.

HTML

<div id="sortable">
    <div>1</div>
    <div>2</div>
    <div>3</div>
    <div>4</div>
</div>

JS

$("#sortable").sortable({
    placeholder: 'placeholder',
    helper: 'clone',
    start: function(event, ui){
        ui.item.show();
    }
});

CSS

#sortable div{
  background-color: #f00;
  width: 50px;
  height: 50px;
  margin: 10px;
  padding: 0px;
}
#sortable div.placeholder{
  height: 4px;
  margin: -7px 10px;
}

Sortable - Animate revert of unaccepted item

Working Example: https://jsfiddle.net/Twisty/4f5yh3pa/7/

Cancelling and Reverting a sortable is not strongly documented. The helps show how moving an item from one list to another connected list can be conditionally cancelled. by default, this is not animated by sortable, this example includes an animation.

Result: List #2 only accepts items that have a class of acceptable. Both lists can be sorted naturally otherwise.

HTML

<div class="ui-widget">
  <ul id="sortable1" class="connectedSortable">
    <li class="ui-state-default acceptable">Item 1</li>
    <li class="ui-state-default">Item 2</li>
    <li class="ui-state-default">Item 3</li>
    <li class="ui-state-default">Item 4</li>
    <li class="ui-state-default">Item 5</li>
  </ul>
  <ul id="sortable2" class="connectedSortable">
    <li class="ui-state-default">Item 6</li>
    <li class="ui-state-default acceptable">Item 7</li>
  </ul>
</div>

CSS

.ui-widget {
  position: relative;
}

.connectedSortable {
  border: 1px solid #eee;
  width: 142px;
  min-height: 20px;
  list-style-type: none;
  margin: 0;
  padding: 5px 0 0 0;
  float: left;
  margin-right: 10px;
}

#sortable1 {
  background: #fff;
}

#sortable2 {
  background: #999;
}

.connectedSortable li {
  margin: 0 5px 5px 5px;
  padding: 5px;
  font-size: 1.2em;
  width: 120px;
}

JavaScript

$(function() {
  $(".connectedSortable").sortable({
    connectWith: ".connectedSortable",
    receive: function(e, ui) {
      var $self = $(this);
      var $item = ui.item;
      var $sender = ui.sender;
      // Restrict condition to only one specific list if desired
      if ($(e.target).attr("id") == "sortable2") {
        if ($item.hasClass("acceptable")) {
          // Item Accepted
          console.log($self.attr("id") + " accepted item from: #" + $sender.attr("id") + " > " + $item.text());
        } else {
          // Item Rejected
          console.log($self.attr("id") + " rejected item from: #" + $sender.attr("id") + " > " + $item.text());
          // Animate the return of the items position
          $item.css("position", "absolute").animate(ui.originalPosition, "slow", function() {
            // Return the items position control to it's parent
            $item.css("position", "inherit");
            // Cancel the sortable action to return it to it's origin
            $sender.sortable("cancel");
          });
        }
      }
    }
  }).disableSelection();
});

This modified text is an extract of the original Stack Overflow Documentation created by the contributors and released under CC BY-SA 3.0 This website is not affiliated with Stack Overflow