jQuery UI 实例 – 排序(Sortable)

使用鼠标调整列表中或者网格中元素的排序。

如需了解更多有关 sortable 交互的细节,请查看 API 文档 可排序小部件(Sortable Widget)。

默认功能

在任意的 DOM 元素上启用 sortable 功能。通过鼠标点击并拖拽元素到列表中的一个新的位置,其它条目会自动调整。默认情况下,sortable 各个条目共享 draggable 属性。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 排序(Sortable) - 默认功能</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  #sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; }
  #sortable li { margin: 0 3px 3px 3px; padding: 0.4em; padding-left: 1.5em; font-size: 1.4em; height: 18px; }
  #sortable li span { position: absolute; margin-left: -1.3em; }
  </style>
  <script>
  $(function() {
    $( \"#sortable\" ).sortable();
    $( \"#sortable\" ).disableSelection();
  });
  </script>
</head>
<body>
 
<ul>
  <li><span></span>Item 1</li>
  <li><span></span>Item 2</li>
  <li><span></span>Item 3</li>
  <li><span></span>Item 4</li>
  <li><span></span>Item 5</li>
  <li><span></span>Item 6</li>
  <li><span></span>Item 7</li>
</ul>
 
 
</body>
</html>

连接列表

通过向 connectWith 选项传递一个选择器,来把一个列表中的元素排序到另一个列表中,反之亦然。最简单的办法是将带有某个 CSS class 的所有相关的列表分组,然后传递该 class 到 sortable 函数(比如,connectWith: \'.myclass\')。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 排序(Sortable) - 连接列表</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  #sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0 0 2.5em; float: left; margin-right: 10px; }
  #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 120px; }
  </style>
  <script>
  $(function() {
    $( \"#sortable1, #sortable2\" ).sortable({
      connectWith: \".connectedSortable\"
    }).disableSelection();
  });
  </script>
</head>
<body>
 
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
</ul>
 
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
</ul>
 
 
</body>
</html>

标签页连接列表

通过放置列表项到顶部适当的标签页中,来把一个列表中的元素排序到另一个列表中,反之亦然。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 排序(Sortable) - 标签页连接列表</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 120px; }
  </style>
  <script>
  $(function() {
    $( \"#sortable1, #sortable2\" ).sortable().disableSelection();
 
    var $tabs = $( \"#tabs\" ).tabs();
 
    var $tab_items = $( \"ul:first li\", $tabs ).droppable({
      accept: \".connectedSortable li\",
      hoverClass: \"ui-state-hover\",
      drop: function( event, ui ) {
        var $item = $( this );
        var $list = $( $item.find( \"a\" ).attr( \"href\" ) )
          .find( \".connectedSortable\" );
 
        ui.draggable.hide( \"slow\", function() {
          $tabs.tabs( \"option\", \"active\", $tab_items.index( $item ) );
          $( this ).appendTo( $list ).show( \"slow\" );
        });
      }
    });
  });
  </script>
</head>
<body>
 
<div>
  <ul>
    <li><a href=\"#tabs-1\">Nunc tincidunt</a></li>
    <li><a href=\"#tabs-2\">Proin dolor</a></li>
  </ul>
  <div>
    <ul>
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
      <li>Item 4</li>
      <li>Item 5</li>
    </ul>
  </div>
  <div>
    <ul>
      <li>Item 1</li>
      <li>Item 2</li>
      <li>Item 3</li>
      <li>Item 4</li>
      <li>Item 5</li>
    </ul>
  </div>
</div>
 
 
</body>
</html>

延迟开始

通过时间延迟和距离延迟来防止意外的排序。通过 delay 选项设置开始排序之前必须拖拽的毫秒数。通过 distance 选项设置开始排序之前必须拖拽的像素数。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 排序(Sortable) - 延迟开始</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  #sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; margin-bottom: 15px;zoom: 1; }
  #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 95%; }
  </style>
  <script>
  $(function() {
    $( \"#sortable1\" ).sortable({
      delay: 300
    });
 
    $( \"#sortable2\" ).sortable({
      distance: 15
    });
 
    $( \"li\" ).disableSelection();
  });
  </script>
</head>
<body>
 
<h3>时间延迟 300ms:</h3>
 
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
</ul>
 
<h3>距离延迟 15px:</h3>
 
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
</ul>
 
 
</body>
</html>

显示为网格

让 sortable 条目显示为网格,使用 CSS 使得它们带有相同的尺寸且浮动显示。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 排序(Sortable) - 显示为网格</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  #sortable { list-style-type: none; margin: 0; padding: 0; width: 450px; }
  #sortable li { margin: 3px 3px 3px 0; padding: 1px; float: left; width: 100px; height: 90px; font-size: 4em; text-align: center; }
  </style>
  <script>
  $(function() {
    $( \"#sortable\" ).sortable();
    $( \"#sortable\" ).disableSelection();
  });
  </script>
</head>
<body>
 
<ul>
  <li>1</li>
  <li>2</li>
  <li>3</li>
  <li>4</li>
  <li>5</li>
  <li>6</li>
  <li>7</li>
  <li>8</li>
  <li>9</li>
  <li>10</li>
  <li>11</li>
  <li>12</li>
</ul>
 
 
</body>
</html>

放置占位符

当拖拽一个 sortable 条目到一个新的位置时,其他条目将为该条目腾出空间。向 placeholder 选项传递一个 class 来定义可视化的空白的样式。使用布尔值的 forcePlaceholderSize 选项来设置占位符的尺寸。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 排序(Sortable) - 放置占位符</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  #sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; }
  #sortable li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; height: 1.5em; }
  html>body #sortable li { height: 1.5em; line-height: 1.2em; }
  .ui-state-highlight { height: 1.5em; line-height: 1.2em; }
  </style>
  <script>
  $(function() {
    $( \"#sortable\" ).sortable({
      placeholder: \"ui-state-highlight\"
    });
    $( \"#sortable\" ).disableSelection();
  });
  </script>
</head>
<body>
 
<ul>
  <li>Item 1</li>
  <li>Item 2</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
  <li>Item 6</li>
  <li>Item 7</li>
</ul>
 
 
</body>
</html>

处理空列表

通过把 选项设置为 false,来阻止一个列表中的所有条目被放置到一个单独的空列表中。默认情况下,sortable 条目可被放置到空的列表中。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 排序(Sortable) - 处理空列表</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  #sortable1, #sortable2, #sortable3 { list-style-type: none; margin: 0; padding: 0; float: left; margin-right: 10px; background: #eee; padding: 5px; width: 143px;}
  #sortable1 li, #sortable2 li, #sortable3 li { margin: 5px; padding: 5px; font-size: 1.2em; width: 120px; }
  </style>
  <script>
  $(function() {
    $( \"ul.droptrue\" ).sortable({
      connectWith: \"ul\"
    });
 
    $( \"ul.dropfalse\" ).sortable({
      connectWith: \"ul\",
      dropOnEmpty: false
    });
 
    $( \"#sortable1, #sortable2, #sortable3\" ).disableSelection();
  });
  </script>
</head>
<body>
 
<ul>
  <li>可被放置到..</li>
  <li>..一个空列表中</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
</ul>
 
<ul>
  <li>不可被放置到..</li>
  <li>..一个空列表中</li>
  <li>Item 3</li>
  <li>Item 4</li>
  <li>Item 5</li>
</ul>
 
<ul>
</ul>
 
<br style=\"clear:both\">
 
 
</body>
</html>

包含/排除条目

指定通过向 items 选项传递一个 jQuery 选择器哪些项目可排序。该选项之外的项目则是不可排序的,同时它们也不是 sortable 条目的有效的目标。

如果只想防止特定的条目排序,则向 cancel 选项传递一个 jQuery 选择器。已取消的条目依然是其他条目的有效的排序目标。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 排序(Sortable) - 包含/排除条目</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  #sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; zoom: 1; }
  #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 3px; width: 90%; }
  </style>
  <script>
  $(function() {
    $( \"#sortable1\" ).sortable({
      items: \"li:not(.ui-state-disabled)\"
    });
 
    $( \"#sortable2\" ).sortable({
      cancel: \".ui-state-disabled\"
    });
 
    $( \"#sortable1 li, #sortable2 li\" ).disableSelection();
  });
  </script>
</head>
<body>
 
<h3>指定哪个条目是 sortable:</h3>
 
<ul>
  <li>Item 1</li>
  <li>(我不是 sortable 或者一个放置目标)</li>
  <li>(我不是 sortable 或者一个放置目标)</li>
  <li>Item 4</li>
</ul>
 
<h3>取消排序(但作为放置目标):</h3>
 
<ul>
  <li>Item 1</li>
  <li>(我不是 sortable)</li>
  <li>(我不是 sortable)</li>
  <li>Item 4</li>
</ul>
 
 
</body>
</html>

门户组件(Portlets)

启用门户组件(样式化的 div)作为 sortable,并使用 connectWith 选项来允许在列之间进行排序。

<!doctype html>
<html lang=\"en\">
<head>
  <meta charset=\"utf-8\">
  <title>jQuery UI 排序(Sortable) - 门户组件(Portlets)</title>
  <link rel=\"stylesheet\" href=\"//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css\">
  <script src=\"//code.jquery.com/jquery-1.9.1.js\"></script>
  <script src=\"//code.jquery.com/ui/1.10.4/jquery-ui.js\"></script>
  <link rel=\"stylesheet\" href=\"http://jqueryui.com/resources/demos/style.css\">
  <style>
  body {
    min-width: 520px;
  }
  .column {
    width: 170px;
    float: left;
    padding-bottom: 100px;
  }
  .portlet {
    margin: 0 1em 1em 0;
    padding: 0.3em;
  }
  .portlet-header {
    padding: 0.2em 0.3em;
    margin-bottom: 0.5em;
    position: relative;
  }
  .portlet-toggle {
    position: absolute;
    top: 50%;
    right: 0;
    margin-top: -8px;
  }
  .portlet-content {
    padding: 0.4em;
  }
  .portlet-placeholder {
    border: 1px dotted black;
    margin: 0 1em 1em 0;
    height: 50px;
  }
  </style>
  <script>
  $(function() {
    $( \".column\" ).sortable({
      connectWith: \".column\",
      handle: \".portlet-header\",
      cancel: \".portlet-toggle\",
      placeholder: \"portlet-placeholder ui-corner-all\"
    });
 
    $( \".portlet\" )
      .addClass( \"ui-widget ui-widget-content ui-helper-clearfix ui-corner-all\" )
      .find( \".portlet-header\" )
        .addClass( \"ui-widget-header ui-corner-all\" )
        .prepend( \"<span class=\'ui-icon ui-icon-minusthick portlet-toggle\'></span>\");
 
    $( \".portlet-toggle\" ).click(function() {
      var icon = $( this );
      icon.toggleClass( \"ui-icon-minusthick ui-icon-plusthick\" );
      icon.closest( \".portlet\" ).find( \".portlet-content\" ).toggle();
    });
  });
  </script>
</head>
<body>
 
<div>
 
  <div>
    <div>订阅</div>
    <div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
  </div>
 
  <div>
    <div>新闻</div>
    <div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
  </div>
 
</div>
 
<div>
 
  <div>
    <div>购物</div>
    <div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
  </div>
 
</div>
 
<div>
 
  <div>
    <div>链接</div>
    <div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
  </div>
 
  <div>
    <div>图像</div>
    <div>Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
  </div>
 
</div>
 
 
</body>
</html>