拖放排序是WEB应用中常见的功能。虽然网上有很多别人已经造好的轮子,但是就我个人而言,没事就喜欢研究原理,自己造轮子,不管强大与否,简洁够用就是我的目标,再一个就是自己写的东西,应用起来得心应手,修改或者扩展起来也是得心应手,相比一些API不够详细,或者说用户体验不好(不够简明)的API来说,或者说插件本身就没考虑周到,考虑周到又显得臃肿来说,使用它还不如造它。

接下来回到插件,先看看漂亮的UI(参照Teambition的任务面板做的,算不算广告 [/惊叹]),插件目前只做了(针对)上下拖放排序,左右拖放排序等有时间再做(我希望API是极度简单的,即便增加左右排序):

二、插件原理(授人以鱼还要授人以渔):

1、确定要拖放的一堆元素,正常情况是一堆li(假设现在的Demo是li)。

2、给每个li添加鼠标按下(elem.onmousedown),和按下移动(document.onmousemove),按下抬起的事件(document.onmouseup),类似于拖拽的原理,鉴于性能,应该考虑用事件委托的形式。

3、当拖动元素执行move事件的时候,在它前面创建并添加一个跟它一样样式的元素并清空内容用于占位操作(假设这个占位元素叫clone),再把拖动元素设置为绝对定位,并把它的DOM结构放到父级(ul)的末尾。

4、在移动过程中判断拖动的元素的top值与clone元素的上一个兄弟节点比较,如果top小于上一个兄弟节点的offset().top值(这里,本插件用top值与offset().top - 兄弟节点的height()/2,交互形式不同而已),那么就将clone元素与上一个兄弟节点交换DOM结构即可,同理判断top是否大于下一个兄弟节点的offset().top值,如果大于就让clone元素与下一个兄弟节点交换DOM结构即可。

5、当中的一些细节处理和兼容处理先略过。

三、简洁:插件加上那么多漂亮的空行和注释才115行GitHub地址

四、使用方法:

1、假设Html结构如下:

<div id="wrap">
<ul>
<li>...</li>
<li>...</li>
...
</ul>
</div>

2、依次引入jquery.js和ddsort.js,然后使用DDSort API实现如图拖放排序效果:

$( '#wrap' ).DDSort({
target: 'li',
floatStyle: {
'border': '1px solid #ccc',
'background-color': '#fff'
}
});

五、详细API(其实也是极少极简单):

DDSort方法只接受一个JSON对象类型的参数,以下是对这个参数的描述。

参数列表 类型 描述
target string 插件内部使用的是jQuery的on方法绑定的事件,此参数就是on方法上的选择器字符串
cloneStyle object 可选,设置占位符元素的样式
floatStyle object 可选,设置拖动元素的样式
down function 可选,鼠标按下时执行的函数
move function 可选,鼠标移动时执行的函数
up function 可选,鼠标抬起时执行的函数

六、插件目前还很小,虽然够正常的使用,但是有些不正常的样式可能还未考虑到,比如说当li的某个父级有相对定位时(父级不是body),拖动元素的left,top值就会存在问题,当然也许这个跟业务的增长和DOM结构有关,目前我还没接触到这样的结构,所以欢迎有志趣的小伙伴Fork DDSort,提交你酷炫简洁的代码。

七、插件地址与下载:https://github.com/Barrior/DDSort,感谢Star。

一个简洁漂亮的jQuery拖放排序插件DDSort的更多相关文章

  1. Sortable – 简单灵活的 JavaScript 拖放排序插件

    当需要在网站中添加拖放排序功能的时候,jQuery UI 的排序组件可能是最流行的解决方案.今天给大家介绍另一款简单灵活的 JavaScript 拖放排序插件——Sortable,它使用 HTML5 ...

  2. 一款简洁大气的jquery日期日历插件

    本jquery插件名为manhuaDate,暂时只支持jquery 1.9.0以下版本,比如jquery-1.8.3.min.js 查看效果网址:http://keleyi.com/a/bjad/em ...

  3. jQuery 表格排序插件 Tablesorter 使用

    jQuery 表格排序插件 Tablesorter 使用方式如下: 1.引入头文件(注意一定要把jQuery放在前面): <script src="lib/jquery-1.8.3.m ...

  4. FlexSlider是一个非常出色的jQuery滑动切换插件

    FlexSlider是一个非常出色的jQuery滑动切换插件,它支持所有主流浏览器,并有淡入淡出效果.适合所有初级和高级网页设计师使用.不过很多人都只是使用默认的参数,今天来说说具体的参数来给大家看看 ...

  5. html5支持drag的拖放排序插件sortable.js

    html5支持drag的拖放排序插件sortable.js <script src="//cdnjs.cloudflare.com/ajax/libs/Sortable/1.5.1/S ...

  6. 拖放排序插件Sortable.js 兼容好及功能全个人觉得比dragula.js 好的多

    经测试,Sortable.js 兼容好和使用方便都是比较不错的,特别手机端使用很棒 介绍 Sortable.js是一款轻量级的拖放排序列表的js插件(虽然体积小,但是功能很强大)下载地址:https: ...

  7. 拖放排序插件Sortable.js

    特点 支持触屏设备和大部分浏览器(IE9以下的就不支持了,原因都懂得) 可以从一个列表容器中拖拽一个列表单元到其他容器或本列表容器中进行排序 移动列表单元时有css动画 支持拖放操作和可选择的文本(这 ...

  8. 【新手向】一个超简单的jquery.mCustomScrollbar滚动条插件Demo

    <script src="https://cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script> < ...

  9. Table Dragger - 简单的 JS 拖放排序表格插件

    Table Dragger 是一个极简的实现拖放排序的表格插件,纯 JavaScript 库,不依赖 jQuery.用于构建操作方便的拖放排序功能,超级容易设置,有平滑的动画,支持触摸事件. 在线演示 ...

随机推荐

  1. ES6入门八:Promise异步编程与模拟实现源码

    Promise的基本使用入门: ——实例化promise对象与注册回调 ——宏任务与微任务的执行顺序 ——then方法的链式调用与抛出错误(throw new Error) ——链式调用的返回值与传值 ...

  2. uboot学习之uboot启动流程简述

    一.uboot启动分为了三个阶段BL0.BL1.BL2:BL0表示上电后运行ROM中固化的一段程序,其中ROM中的程序是厂家写进去的,所以具体功能可能根据厂家芯片而有所不同.功能如下: 初始化系统时钟 ...

  3. JDBC的批处理学习rewriteBatchedStatements=true

    如果在不添加批处理指令的情况下,mysql默认是不使用批处理操作,如果在url尾部添加rewriteBatchedStatements=true 可以使当前连接 使用批处理操作 创建数据库表结构 cr ...

  4. 【面试题】Java常见面试题

    集合与数组? 数组:(可以存储基本数据类型)是用来存储对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用 集合:(只能存储对象,对象类型可以不一样)集合的长度可变,可在多数情况下使用 ...

  5. Kubernetes的Deployment对象使用

    一.什么是Deployment对象 明明ReplicaSet已经可以控制pod的数量了,为什么还需要Deployment? Deploymen实际上一个两层控制器,遵循一种滚动更新的方式来实升级现有的 ...

  6. 为什么不使用SOAP进行点对点联系,而使用ESB呢

    图片截至: https://www.zhihu.com/question/29475224

  7. 引用极光jar包之后出现控制台日志打印不出来的问题。解决!

    由于极光的jar包中引用的有log4j,项目本身也引用有log4j,如果版本有冲突,则会出现控制台日志记录打印不出来的现象.解决:引用极光jar包的时候,排除log4j. <dependency ...

  8. 定一条数据用: => slot-scope属性,再显示对应的数据

    通过 Scoped slot 可以获取到 row, column, $index 和 store(table 内部的状态管理)的数据: {{scope.row}} =>获取整行的数据 {{sco ...

  9. Akka实现WordCount(Scala)

    Akka实现WordCount(Scala): 架构图: 项目结构: pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0 ...

  10. 面试|简单描述MySQL中,索引,主键,唯一索引,联合索引 的区别,对数据库的性能有什么影响(从读写两方面)

    索引是一种特殊的文件(InnoDB 数据表上的索引是表空间的一个组成部分),它们 包含着对数据表里所有记录的引用指针. 普通索引(由关键字 KEY 或 INDEX 定义的索引)的唯一任务是加快对数据的 ...