课程表

jQuery UI 基础

jQuery UI 主题

jQuery UI 部件库

jQuery UI 参考手册

jQuery UI 实例

工具箱
速查手册

排序(Sortable)

当前位置:免费教程 » JS/JS库/框架 » jQuery UI

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

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

默认功能

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

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>jQuery UI 排序(Sortable) - 默认功能</title>
  6. <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  7. <script src="//code.jquery.com/jquery-1.9.1.js"></script>
  8. <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  9. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
  10. <style>
  11. #sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; }
  12. #sortable li { margin: 0 3px 3px 3px; padding: 0.4em; padding-left: 1.5em; font-size: 1.4em; height: 18px; }
  13. #sortable li span { position: absolute; margin-left: -1.3em; }
  14. </style>
  15. <script>
  16. $(function() {
  17. $( "#sortable" ).sortable();
  18. $( "#sortable" ).disableSelection();
  19. });
  20. </script>
  21. </head>
  22. <body>
  23. <ul id="sortable">
  24. <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 1</li>
  25. <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 2</li>
  26. <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 3</li>
  27. <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 4</li>
  28. <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 5</li>
  29. <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 6</li>
  30. <li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>Item 7</li>
  31. </ul>
  32. </body>
  33. </html>

我要试一下

连接列表

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

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>jQuery UI 排序(Sortable) - 连接列表</title>
  6. <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  7. <script src="//code.jquery.com/jquery-1.9.1.js"></script>
  8. <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  9. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
  10. <style>
  11. #sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0 0 2.5em; float: left; margin-right: 10px; }
  12. #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 120px; }
  13. </style>
  14. <script>
  15. $(function() {
  16. $( "#sortable1, #sortable2" ).sortable({
  17. connectWith: ".connectedSortable"
  18. }).disableSelection();
  19. });
  20. </script>
  21. </head>
  22. <body>
  23. <ul id="sortable1" class="connectedSortable">
  24. <li class="ui-state-default">Item 1</li>
  25. <li class="ui-state-default">Item 2</li>
  26. <li class="ui-state-default">Item 3</li>
  27. <li class="ui-state-default">Item 4</li>
  28. <li class="ui-state-default">Item 5</li>
  29. </ul>
  30. <ul id="sortable2" class="connectedSortable">
  31. <li class="ui-state-highlight">Item 1</li>
  32. <li class="ui-state-highlight">Item 2</li>
  33. <li class="ui-state-highlight">Item 3</li>
  34. <li class="ui-state-highlight">Item 4</li>
  35. <li class="ui-state-highlight">Item 5</li>
  36. </ul>
  37. </body>
  38. </html>

我要试一下

标签页连接列表

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

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>jQuery UI 排序(Sortable) - 标签页连接列表</title>
  6. <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  7. <script src="//code.jquery.com/jquery-1.9.1.js"></script>
  8. <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  9. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
  10. <style>
  11. #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 120px; }
  12. </style>
  13. <script>
  14. $(function() {
  15. $( "#sortable1, #sortable2" ).sortable().disableSelection();
  16. var $tabs = $( "#tabs" ).tabs();
  17. var $tab_items = $( "ul:first li", $tabs ).droppable({
  18. accept: ".connectedSortable li",
  19. hoverClass: "ui-state-hover",
  20. drop: function( event, ui ) {
  21. var $item = $( this );
  22. var $list = $( $item.find( "a" ).attr( "href" ) )
  23. .find( ".connectedSortable" );
  24. ui.draggable.hide( "slow", function() {
  25. $tabs.tabs( "option", "active", $tab_items.index( $item ) );
  26. $( this ).appendTo( $list ).show( "slow" );
  27. });
  28. }
  29. });
  30. });
  31. </script>
  32. </head>
  33. <body>
  34. <div id="tabs">
  35. <ul>
  36. <li><a href="#tabs-1">Nunc tincidunt</a></li>
  37. <li><a href="#tabs-2">Proin dolor</a></li>
  38. </ul>
  39. <div id="tabs-1">
  40. <ul id="sortable1" class="connectedSortable ui-helper-reset">
  41. <li class="ui-state-default">Item 1</li>
  42. <li class="ui-state-default">Item 2</li>
  43. <li class="ui-state-default">Item 3</li>
  44. <li class="ui-state-default">Item 4</li>
  45. <li class="ui-state-default">Item 5</li>
  46. </ul>
  47. </div>
  48. <div id="tabs-2">
  49. <ul id="sortable2" class="connectedSortable ui-helper-reset">
  50. <li class="ui-state-highlight">Item 1</li>
  51. <li class="ui-state-highlight">Item 2</li>
  52. <li class="ui-state-highlight">Item 3</li>
  53. <li class="ui-state-highlight">Item 4</li>
  54. <li class="ui-state-highlight">Item 5</li>
  55. </ul>
  56. </div>
  57. </div>
  58. </body>
  59. </html>

我要试一下

延迟开始

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

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>jQuery UI 排序(Sortable) - 延迟开始</title>
  6. <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  7. <script src="//code.jquery.com/jquery-1.9.1.js"></script>
  8. <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  9. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
  10. <style>
  11. #sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; margin-bottom: 15px;zoom: 1; }
  12. #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; width: 95%; }
  13. </style>
  14. <script>
  15. $(function() {
  16. $( "#sortable1" ).sortable({
  17. delay: 300
  18. });
  19. $( "#sortable2" ).sortable({
  20. distance: 15
  21. });
  22. $( "li" ).disableSelection();
  23. });
  24. </script>
  25. </head>
  26. <body>
  27. <h3 class="docs">时间延迟 300ms:</h3>
  28. <ul id="sortable1">
  29. <li class="ui-state-default">Item 1</li>
  30. <li class="ui-state-default">Item 2</li>
  31. <li class="ui-state-default">Item 3</li>
  32. <li class="ui-state-default">Item 4</li>
  33. </ul>
  34. <h3 class="docs">距离延迟 15px:</h3>
  35. <ul id="sortable2">
  36. <li class="ui-state-default">Item 1</li>
  37. <li class="ui-state-default">Item 2</li>
  38. <li class="ui-state-default">Item 3</li>
  39. <li class="ui-state-default">Item 4</li>
  40. </ul>
  41. </body>
  42. </html>

我要试一下

显示为网格

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

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>jQuery UI 排序(Sortable) - 显示为网格</title>
  6. <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  7. <script src="//code.jquery.com/jquery-1.9.1.js"></script>
  8. <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  9. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
  10. <style>
  11. #sortable { list-style-type: none; margin: 0; padding: 0; width: 450px; }
  12. #sortable li { margin: 3px 3px 3px 0; padding: 1px; float: left; width: 100px; height: 90px; font-size: 4em; text-align: center; }
  13. </style>
  14. <script>
  15. $(function() {
  16. $( "#sortable" ).sortable();
  17. $( "#sortable" ).disableSelection();
  18. });
  19. </script>
  20. </head>
  21. <body>
  22. <ul id="sortable">
  23. <li class="ui-state-default">1</li>
  24. <li class="ui-state-default">2</li>
  25. <li class="ui-state-default">3</li>
  26. <li class="ui-state-default">4</li>
  27. <li class="ui-state-default">5</li>
  28. <li class="ui-state-default">6</li>
  29. <li class="ui-state-default">7</li>
  30. <li class="ui-state-default">8</li>
  31. <li class="ui-state-default">9</li>
  32. <li class="ui-state-default">10</li>
  33. <li class="ui-state-default">11</li>
  34. <li class="ui-state-default">12</li>
  35. </ul>
  36. </body>
  37. </html>

我要试一下

放置占位符

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

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>jQuery UI 排序(Sortable) - 放置占位符</title>
  6. <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  7. <script src="//code.jquery.com/jquery-1.9.1.js"></script>
  8. <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  9. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
  10. <style>
  11. #sortable { list-style-type: none; margin: 0; padding: 0; width: 60%; }
  12. #sortable li { margin: 0 5px 5px 5px; padding: 5px; font-size: 1.2em; height: 1.5em; }
  13. html>body #sortable li { height: 1.5em; line-height: 1.2em; }
  14. .ui-state-highlight { height: 1.5em; line-height: 1.2em; }
  15. </style>
  16. <script>
  17. $(function() {
  18. $( "#sortable" ).sortable({
  19. placeholder: "ui-state-highlight"
  20. });
  21. $( "#sortable" ).disableSelection();
  22. });
  23. </script>
  24. </head>
  25. <body>
  26. <ul id="sortable">
  27. <li class="ui-state-default">Item 1</li>
  28. <li class="ui-state-default">Item 2</li>
  29. <li class="ui-state-default">Item 3</li>
  30. <li class="ui-state-default">Item 4</li>
  31. <li class="ui-state-default">Item 5</li>
  32. <li class="ui-state-default">Item 6</li>
  33. <li class="ui-state-default">Item 7</li>
  34. </ul>
  35. </body>
  36. </html>

我要试一下

处理空列表

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

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>jQuery UI 排序(Sortable) - 处理空列表</title>
  6. <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  7. <script src="//code.jquery.com/jquery-1.9.1.js"></script>
  8. <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  9. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
  10. <style>
  11. #sortable1, #sortable2, #sortable3 { list-style-type: none; margin: 0; padding: 0; float: left; margin-right: 10px; background: #eee; padding: 5px; width: 143px;}
  12. #sortable1 li, #sortable2 li, #sortable3 li { margin: 5px; padding: 5px; font-size: 1.2em; width: 120px; }
  13. </style>
  14. <script>
  15. $(function() {
  16. $( "ul.droptrue" ).sortable({
  17. connectWith: "ul"
  18. });
  19. $( "ul.dropfalse" ).sortable({
  20. connectWith: "ul",
  21. dropOnEmpty: false
  22. });
  23. $( "#sortable1, #sortable2, #sortable3" ).disableSelection();
  24. });
  25. </script>
  26. </head>
  27. <body>
  28. <ul id="sortable1" class="droptrue">
  29. <li class="ui-state-default">可被放置到..</li>
  30. <li class="ui-state-default">..一个空列表中</li>
  31. <li class="ui-state-default">Item 3</li>
  32. <li class="ui-state-default">Item 4</li>
  33. <li class="ui-state-default">Item 5</li>
  34. </ul>
  35. <ul id="sortable2" class="dropfalse">
  36. <li class="ui-state-highlight">不可被放置到..</li>
  37. <li class="ui-state-highlight">..一个空列表中</li>
  38. <li class="ui-state-highlight">Item 3</li>
  39. <li class="ui-state-highlight">Item 4</li>
  40. <li class="ui-state-highlight">Item 5</li>
  41. </ul>
  42. <ul id="sortable3" class="droptrue">
  43. </ul>
  44. <br style="clear:both">
  45. </body>
  46. </html>

我要试一下

包含/排除条目

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

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

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>jQuery UI 排序(Sortable) - 包含/排除条目</title>
  6. <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  7. <script src="//code.jquery.com/jquery-1.9.1.js"></script>
  8. <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  9. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
  10. <style>
  11. #sortable1, #sortable2 { list-style-type: none; margin: 0; padding: 0; zoom: 1; }
  12. #sortable1 li, #sortable2 li { margin: 0 5px 5px 5px; padding: 3px; width: 90%; }
  13. </style>
  14. <script>
  15. $(function() {
  16. $( "#sortable1" ).sortable({
  17. items: "li:not(.ui-state-disabled)"
  18. });
  19. $( "#sortable2" ).sortable({
  20. cancel: ".ui-state-disabled"
  21. });
  22. $( "#sortable1 li, #sortable2 li" ).disableSelection();
  23. });
  24. </script>
  25. </head>
  26. <body>
  27. <h3 class="docs">指定哪个条目是 sortable:</h3>
  28. <ul id="sortable1">
  29. <li class="ui-state-default">Item 1</li>
  30. <li class="ui-state-default ui-state-disabled">(我不是 sortable 或者一个放置目标)</li>
  31. <li class="ui-state-default ui-state-disabled">(我不是 sortable 或者一个放置目标)</li>
  32. <li class="ui-state-default">Item 4</li>
  33. </ul>
  34. <h3 class="docs">取消排序(但作为放置目标):</h3>
  35. <ul id="sortable2">
  36. <li class="ui-state-default">Item 1</li>
  37. <li class="ui-state-default ui-state-disabled">(我不是 sortable)</li>
  38. <li class="ui-state-default ui-state-disabled">(我不是 sortable)</li>
  39. <li class="ui-state-default">Item 4</li>
  40. </ul>
  41. </body>
  42. </html>

我要试一下

门户组件(Portlets)

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

  1. <!doctype html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <title>jQuery UI 排序(Sortable) - 门户组件(Portlets)</title>
  6. <link rel="stylesheet" href="//code.jquery.com/ui/1.10.4/themes/smoothness/jquery-ui.css">
  7. <script src="//code.jquery.com/jquery-1.9.1.js"></script>
  8. <script src="//code.jquery.com/ui/1.10.4/jquery-ui.js"></script>
  9. <link rel="stylesheet" href="http://jqueryui.com/resources/demos/style.css">
  10. <style>
  11. body {
  12. min-width: 520px;
  13. }
  14. .column {
  15. width: 170px;
  16. float: left;
  17. padding-bottom: 100px;
  18. }
  19. .portlet {
  20. margin: 0 1em 1em 0;
  21. padding: 0.3em;
  22. }
  23. .portlet-header {
  24. padding: 0.2em 0.3em;
  25. margin-bottom: 0.5em;
  26. position: relative;
  27. }
  28. .portlet-toggle {
  29. position: absolute;
  30. top: 50%;
  31. right: 0;
  32. margin-top: -8px;
  33. }
  34. .portlet-content {
  35. padding: 0.4em;
  36. }
  37. .portlet-placeholder {
  38. border: 1px dotted black;
  39. margin: 0 1em 1em 0;
  40. height: 50px;
  41. }
  42. </style>
  43. <script>
  44. $(function() {
  45. $( ".column" ).sortable({
  46. connectWith: ".column",
  47. handle: ".portlet-header",
  48. cancel: ".portlet-toggle",
  49. placeholder: "portlet-placeholder ui-corner-all"
  50. });
  51. $( ".portlet" )
  52. .addClass( "ui-widget ui-widget-content ui-helper-clearfix ui-corner-all" )
  53. .find( ".portlet-header" )
  54. .addClass( "ui-widget-header ui-corner-all" )
  55. .prepend( "<span class='ui-icon ui-icon-minusthick portlet-toggle'></span>");
  56. $( ".portlet-toggle" ).click(function() {
  57. var icon = $( this );
  58. icon.toggleClass( "ui-icon-minusthick ui-icon-plusthick" );
  59. icon.closest( ".portlet" ).find( ".portlet-content" ).toggle();
  60. });
  61. });
  62. </script>
  63. </head>
  64. <body>
  65. <div class="column">
  66. <div class="portlet">
  67. <div class="portlet-header">订阅</div>
  68. <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
  69. </div>
  70. <div class="portlet">
  71. <div class="portlet-header">新闻</div>
  72. <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
  73. </div>
  74. </div>
  75. <div class="column">
  76. <div class="portlet">
  77. <div class="portlet-header">购物</div>
  78. <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
  79. </div>
  80. </div>
  81. <div class="column">
  82. <div class="portlet">
  83. <div class="portlet-header">链接</div>
  84. <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
  85. </div>
  86. <div class="portlet">
  87. <div class="portlet-header">图像</div>
  88. <div class="portlet-content">Lorem ipsum dolor sit amet, consectetuer adipiscing elit</div>
  89. </div>
  90. </div>
  91. </body>
  92. </html>

我要试一下

转载本站内容时,请务必注明来自W3xue,违者必究。
 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号