本文仅做翻译记录查看,GitHub原项目地址: 
https://github.com/RubaXa/Sortable/ ,建议将Sortable.js下载到本地,GitHub上的例子在复制到本地运行,在 http://jsbin.com 上运行很多时候会报Sortable is not defined 的错误。

Sortable.js是用于在现代浏览器和触摸设备上重新拖放排序列表的JavaScript库,支持jQuery,Meteor,AngularJS,React,Polymer,Knockout和兼容任何CSS库。

特征

  1. 支持触摸设备和现代浏览器(包括IE9)
  2. 可以从一个列表拖动到另一个列表或在同一列表中
  3. 移动项目时的CSS动画
  4. 支持拖动手柄和可选文本
  5. 智能自动滚动
  6. 使用原生HTML5拖放API构建
  7. 支持任何CSS库
  8. 简单的API
  9. 不基于jQuery(但同样也支持)

安装

通过npm

  1. $ npm install sortablejs --save
  • 1

使用

  1. <ul id="items">
  2. <li>item 1</li>
  3. <li>item 2</li>
  4. <li>item 3</li>
  5. </ul>
  6. var el = document.getElementById('items');
  1. var sortable = Sortable.create(el);

您可以使用列表及其元素的任何元素,而不仅仅是ulli。这是div 的例子 。

参数

  1. var sortable = new Sortable(el, {
  2. group: "name", // or { name: "...", pull: [true, false, clone], put: [true, false, array] }
  3. sort: true, //在列表内支持排序。 sorting inside list
  4. delay: 0, // 时间以毫秒为单位来定义排序应该何时开始。 time in milliseconds to define when the sorting should start
  5. touchStartThreshold: 0, // 像素,在多少像素移动范围内课取消延迟拖动事件。 px, how many pixels the point should move before cancelling a delayed drag event
  6. disabled: false, // 如果设置为true,则禁用排序。 Disables the sortable if set to true.
  7. store: null, // @see Store
  8. animation: 150, // 毫秒,排序时移动物品的动画速度,`0`则表示无动画。 ms, animation speed moving items when sorting, `0` — without animation
  9. handle: ".my-handle", // 列表项中拖动手柄选择,可以设置列表中item中的某个DOM节点为拖动的依据。 Drag handle selector within list items
  10. filter: ".ignore-elements", // 选择不支持拖动的选择器(String或Function)。 Selectors that do not lead to dragging (String or Function)
  11. preventOnFilter: true, // 触发`filter`时调用`event.preventDefault()`。 Call `event.preventDefault()` when triggered `filter`
  12. draggable: ".item", // 指定元素中的哪些项应该是可拖动的。 Specifies which items inside the element should be draggable
  13. ghostClass: "sortable-ghost", // 拖放时,提前预设DOM节点的class名称,可在此class下定义相应的样式。 Class name for the drop placeholder
  14. chosenClass: "sortable-chosen", // 选中时的DOM节点的class名称,可在此class下定义相应的样式。Class name for the chosen item
  15. dragClass: "sortable-drag", // 拖放时的DOM节点的class名称,可在此class下定义相应的样式。Class name for the dragging item
  16. dataIdAttr: 'data-id',
  17.  
  18. forceFallback: false, // 忽略HTML5 DnD行为并强制回退使用。ignore the HTML5 DnD behaviour and force the fallback to kick in
  19.  
  20. fallbackClass: "sortable-fallback", //使用forceFallback时的克隆DOM元素的类名。 Class name for the cloned DOM Element when using forceFallback
  21. fallbackOnBody: false, // 将克隆的DOM元素追加到Document中Body 。Appends the cloned DOM Element into the Document's Body
  22. fallbackTolerance: 0, // 以像素为单位指定鼠标在被视为拖动之前应移动多远。Specify in pixels how far the mouse should move before it's considered as a drag.
  23.  
  24. scroll: true, // or HTMLElement
  25. scrollFn: function(offsetX, offsetY, originalEvent, touchEvt, hoverTargetEl) { ... }, // 如果你有自定义滚动条scrollFn可用于自动滚动 。if you have custom scrollbar scrollFn may be used for autoscrolling
  26. scrollSensitivity: 30, // 鼠标必须靠近边缘多少px才能开始滚动。px, how near the mouse must be to an edge to start scrolling.
  27. scrollSpeed: 10, // 滚动速度。px
  28.  
  29. setData: function (/** DataTransfer */dataTransfer, /** HTMLElement*/dragEl) {
  30. dataTransfer.setData('Text', dragEl.textContent); // `dataTransfer` object of HTML5 DragEvent
  31. },
  32.  
  33. // Element is chosen
  34. onChoose: function (/**Event*/evt) {
  35. evt.oldIndex; // element index within parent
  36. },
  37.  
  38. // Element dragging started
  39. onStart: function (/**Event*/evt) {
  40. evt.oldIndex; // element index within parent
  41. },
  42.  
  43. // Element dragging ended
  44. onEnd: function (/**Event*/evt) {
  45. var itemEl = evt.item; // dragged HTMLElement
  46. evt.to; // target list
  47. evt.from; // previous list
  48. evt.oldIndex; // element's old index within old parent
  49. evt.newIndex; // element's new index within new parent
  50. },
  51.  
  52. // Element is dropped into the list from another list
  53. onAdd: function (/**Event*/evt) {
  54. // same properties as onEnd
  55. },
  56.  
  57. // Changed sorting within list
  58. onUpdate: function (/**Event*/evt) {
  59. // same properties as onEnd
  60. },
  61.  
  62. // Called by any change to the list (add / update / remove)
  63. onSort: function (/**Event*/evt) {
  64. // same properties as onEnd
  65. },
  66.  
  67. // Element is removed from the list into another list
  68. onRemove: function (/**Event*/evt) {
  69. // same properties as onEnd
  70. },
  71.  
  72. // Attempt to drag a filtered element
  73. onFilter: function (/**Event*/evt) {
  74. var itemEl = evt.item; // HTMLElement receiving the `mousedown|tapstart` event.
  75. },
  76.  
  77. // Event when you move an item in the list or between lists
  78. onMove: function (/**Event*/evt, /**Event*/originalEvent) {
  79. // Example: http://jsbin.com/tuyafe/1/edit?js,output
  80. evt.dragged; // dragged HTMLElement
  81. evt.draggedRect; // TextRectangle {left, top, right и bottom}
  82. evt.related; // HTMLElement on which have guided
  83. evt.relatedRect; // TextRectangle
  84. originalEvent.clientY; // mouse position
  85. // return false; — for cancel
  86. },
  87.  
  88. // Called when creating a clone of element
  89. onClone: function (/**Event*/evt) {
  90. var origEl = evt.item;
  91. var cloneEl = evt.clone;
  92. }
  93. });

  

  1.  

group

要将元素从一个列表拖动到另一个列表,两个列表必须具有相同的group值。您还可以定义列表是否可以放弃,提供和保留副本(clone)以及接收元素。

  1. name:String–组名
  2. pull:true|false|'clone'|function–从列表中移动的能力。clone - 复制项目,而不是移动。
  3. puttrue|false|["foo", "bar"]|function –是否可以从其他列表添加元素,或者可以从中获取元素的组名称数组。
  4. revertCloneboolean–移动到另一个列表后,将克隆元素恢复到初始位置。

sort

在列表内排序。

delay

定义何时开始排序的时间(以毫秒为单位)。

touchStartThreshold

此选项与fallbackTolerance选项类似。

delay设置此选项后,即使您的手指没有移动,一些具有非常敏感触摸显示屏的手机(如三星Galaxy S8)也会触发不需要的触摸移动事件,从而导致排序无法触发。

此选项设置在取消延迟排序之前必须发生的最小指针移动。

3到5之间最好。

disabled

如果设置为 true,则禁用sortable。

  1. var sortable = Sortable.create(list);
  2. document.getElementById("switcher").onclick = function () {
  3. var state = sortable.option("disabled"); // get
  4. sortable.option("disabled", !state); // set
  5. };

handle

要使列表项可拖动,Sortable将禁用用户的文本选择。这并不总是令人满意的。要允许文本选择,请定义拖动处理程序,该处理程序是允许拖动它的每个列表元素的区域。

  1. <ul>
  2. <li><span class="my-handle">::</span> list item text one
  3. <li><span class="my-handle">::</span> list item text two
  4. </ul>
  1. Sortable.create(el, {
  2. handle: ".my-handle"
  3. });
  1. .my-handle {
  2. cursor: move;
  3. cursor: -webkit-grabbing;
  4. }

filter

  1. Sortable.create(list, {
  2. filter: ".js-remove, .js-edit",
  3. onFilter: function (evt) {
  4. var item = evt.item,
  5. ctrl = evt.target;
  6. if (Sortable.utils.is(ctrl, ".js-remove")) { // Click on remove button
  7. item.parentNode.removeChild(item); // remove sortable item
  8. }
  9. else if (Sortable.utils.is(ctrl, ".js-edit")) { // Click on edit link
  10. // ...
  11. }
  12. }
  13. })

ghostClass

放置占位符的类名(默认sortable-ghost)。

  1. .ghost {
  2. opacity: 0.4;
  3. }
  1. Sortable.create(list, {
  2. ghostClass: "ghost"
  3. });

chosenClass

所选DOM节点的类名称(默认sortable-chosen)。

  1. .chosen {
  2. color: #fff;
  3. background-color: #c00;
  4. }
  1. Sortable.create(list, {
  2. delay: 500,
  3. chosenClass: "chosen"
  4. });

forceFallback

如果设置为true,则即使我们使用HTML5浏览器,也将使用非HTML5浏览器的后备。这使我们有可能测试旧浏览器的行为,即使在较新的浏览器中,也可以使Drag’n Drop在桌面,移动和旧浏览器之间更加一致。

最重要的是,Fallback总是生成该DOM元素的副本,并附加fallbackClass在选项中定义的类。此行为控制此“拖动”元素的外观。

fallbackTolerance

模拟本机阻力阈值。以像素为单位指定鼠标在被视为拖动之前应移动多远。如果项目也可以在链接列表中单击,则非常有用。

当用户在可排序元素中单击时,在您按下的时间和释放时间之间移动一点并不常见。仅当您将指针移动超过某个公差时才会开始拖动,这样您每次单击时都不会意外地开始拖动。

3到5之间最好。

scroll

如果设置为true,则页面(或可排序区域)在到达边缘时滚动。

scrollFn

定义将用于自动滚动的功能。默认情况下使用el.scrollTop / el.scrollLeft。有自定义滚动条和专用滚动功能时很有用。

scrollSensitivity

定义鼠标必须靠近边缘以开始滚动的方式。

scrollSpeed

鼠标指针进入scrollSensitivity距离后窗口应滚动的速度。

事件对象

  • to:HTMLElement — list,其中移动了元素。
  • from:HTMLElement — 之前存在的list
  • item:HTMLElement — 拖动元素
  • clone:HTMLElement
  • oldIndex:Number|undefined — 父级中的旧索引
  • newIndex:Number|undefined — 父级中的新索引

move —- event object

  • to:HTMLElement
  • from:HTMLElement
  • dragged:HTMLElement
  • draggedRect:TextRectangle
  • related:HTMLElement — 指导的元素
  • relatedRect:TextRectangle

Method

option(name:String[, value:]):

获取或设置选项。

closest(el:String[, selector:HTMLElement]):HTMLElement|null

对于集合中的每个元素,通过测试元素本身并遍历DOM树中的祖先来获取与选择器匹配的第一个元素。

toArray():String[]

将可排序项data-id的(dataIdAttr选项)序列化为字符串数组。

sort(order:String[])

根据数组对元素进行排序。

  1. var order = sortable.toArray();
  2. sortable.sort(order.reverse()); // apply
  • 1
  • 2

save()

保存当前排序

destroy()

完全删除可排序功能。

Store

保存和恢复排序。

  1. <ul>
  2. <li data-id="1">order</li>
  3. <li data-id="2">save</li>
  4. <li data-id="3">restore</li>
  5. </ul>
  1. Sortable.create(el, {
  2. group: "localStorage-example",
  3. store: {
  4. /**
  5. * Get the order of elements. Called once during initialization.
  6. * @param {Sortable} sortable
  7. * @returns {Array}
  8. */
  9. get: function (sortable) {
  10. var order = localStorage.getItem(sortable.options.group.name);
  11. return order ? order.split('|') : [];
  12. },
  13. /**
  14. * Save the order of elements. Called onEnd (when the item is dropped).
  15. * @param {Sortable} sortable
  16. */
  17. set: function (sortable) {
  18. var order = sortable.toArray();
  19. localStorage.setItem(sortable.options.group.name, order.join('|'));
  20. }
  21. }
  22. })

静态方法和属性

Sortable.create(el:HTMLElement[, options:Object]):Sortable

创建新实例。

Sortable.active:Sortable

链接到活动实例。

Sortable.utils

  • on(el:HTMLElement, event:String, fn:Function) — 附加事件处理函数
  • off(el:HTMLElement, event:String, fn:Function) — 删除事件处理程序
  • css(el:HTMLElement):Object — 获取所有CSS属性的值
  • css(el:HTMLElement, prop:String):Mixed — 获取样式属性的值
  • css(el:HTMLElement, prop:String, value:String) — 设置一个CSS属性
  • css(el:HTMLElement, props:Object) — 设置更多CSS属性
  • find(ctx:HTMLElement, tagName:String[, iterator:Function]):Array — 按标签名称获取元素
  • bind(ctx:Mixed, fn:Function):Function — T获取一个函数并返回一个始终具有特定上下文的函数
  • is(el:HTMLElement, selector:String):Boolean — 针对选择器检查当前匹配的元素集
  • closest(el:HTMLElement, selector:String[, ctx:HTMLElement]):HTMLElement|Null — 对于集合中的每个元素,通过测试元素本身并遍历DOM树中的祖先来获取与选择器匹配的第一个元素
  • clone(el:HTMLElement):HTMLElement — 创建匹配元素集的深层副本
  • toggleClass(el:HTMLElement, name:String, state:Boolean) — 从每个元素添加或删除一个类

CDN

  1. <!-- jsDelivr :: Sortable (https://www.jsdelivr.com/package/npm/sortablejs) -->
  2. <script src="https://cdn.jsdelivr.net/npm/sortablejs@1.6.1/Sortable.min.js"></script>
  3. <!-- jsDelivr :: Sortable :: Latest (https://www.jsdelivr.com/package/npm/sortablejs) -->
  4. <script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>

jQuery compatibility

要为jQuery组装插件,请执行以下步骤:

  1. cd Sortable
  2. npm install
  3. grunt jquery

现在您可以使用jquery.fn.sortable.js:( 
或者jquery.fn.sortable.min.js如果您运行grunt jquery:min)

  1. $("#list").sortable({ /* options */ }); // init
  2. $("#list").sortable("widget"); // get Sortable instance
  3. $("#list").sortable("destroy"); // destroy Sortable instance
  4. $("#list").sortable("{method-name}"); // call an instance method
  5. $("#list").sortable("{method-name}", "foo", "bar"); // call an instance method with parameters
  6. 参考:https://blog.csdn.net/fxss5201/article/details/82528189

jq Sortable的使用的更多相关文章

  1. JQUERY 拖拽 draggable droppable resizable selectable sortable

    今天用了jq ui的拖动碰撞功能,好不容易看到有详细的API解说,记录如下:   <script language="JavaScript" type="text/ ...

  2. jq选择器基础

    Jquery $代表选择器 使用jq必须要导入jq文件 <script src="http://libs.baidu.com/jquery/2.0.0/jquery.min.js&qu ...

  3. 基于Metronic的Bootstrap开发框架经验总结(13)--页面链接收藏夹功能的实现2(利用Sortable进行拖动排序)

    在上篇随笔<基于Metronic的Bootstrap开发框架经验总结(12)--页面链接收藏夹功能的实现>上,我介绍了链接收藏夹功能的实现,以及对收藏记录的排序处理.该篇随笔主要使用功能按 ...

  4. JQ实现判断iPhone、Android设备

    最近做了一版微信宣传页,通过JQ来判断设备,并进行下载 微信内置浏览器对下载链接进行了屏蔽,所以先进行判断,如果是微信内置浏览器,则跳转应用宝链接,如果不是,则判断是iPhone/Adroid/PC ...

  5. jq.validate隐藏元素忽略验证

    jq.validate隐藏元素忽略验证 现在有这样一个需求,当触发某类事件时候,需要在页面中显示input框,但是当不需要加载页面中的元素时候,进行隐藏.在这个需求的前提下,程序中对于input中的输 ...

  6. jq.validate 自定义验证两个日期

    jq.validate 自定义验证两个日期 首先定义有一个表单,date1和date2是属于表单的元素,若date1大于date2,返回false:若date1<date2,返回true.使用j ...

  7. jq方法中 $(window).load() 与 $(document).ready() 的区别

    通过自学进入了前端的行列,只知道在js中,一开头就写一个: window.onload = function(){ //doing sth} 然后所有的乱七八糟的代码全塞里面,大概知道window.o ...

  8. jq 根据值的正负变色

    效果图这样: 意思就是根据最后的百分值变色,值为负变绿色,值为正变红色. 所以只要取到那个标签里的值了,就能根据正负的判断决定颜色. 我的html部分这样: /*不过他们都说我的dom结构不太合理,同 ...

  9. jq 个性的隔行变色

      效果图大致这样: 我的html格式部分这样:/*不过他们都说我的dom结构不太合理,同意.BUT,我就是不想写表格而写成的这样的,所以后面jq部分也要迁就了*/ <div class=&qu ...

随机推荐

  1. document.write() 为什么会清空页面

    很久以前遇到的问题,放着放着就忘记去研究了最近看到一篇文章总结一下作者:abloumeurl:   http://blog.csdn.net/u013451157/article/details/78 ...

  2. MySQL数据库:聚合函数的使用

    聚合函数 max() 最大值 min() 最小值 avg() 平均值 sum() 求和 count() 符合条件数据的数目 聚合函数不能嵌套使用 # 在统计时字段内没有满足条件的数值只有count返回 ...

  3. unittest---unittest中verbosity参数设置

    我们在做自动化测试的时候,有时候想要很清楚的看到每条用例执行的详细信息,我们可以通过unittest中verbosity参数进行设置 verbosity参数设置 verbosity表示在只执行用例的过 ...

  4. 《数据挖掘导论》实验课——实验四、数据挖掘之KNN,Naive Bayes

    实验四.数据挖掘之KNN,Naive Bayes 一.实验目的 1. 掌握KNN的原理 2. 掌握Naive Bayes的原理 3. 学会利用KNN与Navie Bayes解决分类问题 二.实验工具 ...

  5. git 分布式控制版本管理器(上)

    git的作用: 1.更方便的存储版本 2.恢复之前的版本 3.更方便的对比 4.协同合作 下载地址git官网: https://git-scm.com/ 可自选自己电脑的操作系统 安装: 一路next ...

  6. Linux下动态切换EHCI控制器下端口的速率(即切换为12M)

    在sys目录下找到对应的控制器 例如:/sys/devices/platform/soc/ehci,直接操作该目录下的companion echo 1  > companion  将port1设 ...

  7. [Spring cloud 一步步实现广告系统] 6. Service实现&Zuul配置&Test

    DAO层设计实现 这里我们使用Spring DATA JPA来实现数据库操作,当然大家也可以使用Mybatis,都是一样的,我们依然以用户表操作为例: /** * AdUserRepository f ...

  8. C# 判断点是否在矩形框内

    欢迎加群交流 QQ群 830426796 用 System.Drawing.Drawing2D.GraphicsPath 和 Region 类联合起来,然后用 Region.IsVisible(poi ...

  9. audio标签以及audio对象

    一.audio标签 简单语法 <audio src="音频链接"></audio> 属性 属性 值 描述 autoplay 如果出现该属性,则音频在就绪后马 ...

  10. PHP给图片加上图片水印和文字水印实例

    下面给大家分享一下PHP给图片加上图片水印和文字水印实例,这也是网站经常用到的功能,把代码加上去,调用就很简单了. 核心代码: function imageWaterMark($groundImage ...