返回

SortableJS 原理及实现源码分析

前端

导读

SortableJS 是一款基于 H5 拖拽 API 实现的轻量级 JS 拖拽排序库。它适用于以下一些场景:

  • 容器项目拖动排序:容器列表内的子项目,通过拖动进行位置调换,且具有动画效果。
  • 容器间项目拖动排序:容器列表间的子项目,通过拖动进行位置调换,且具有动画效果。
  • 表格行拖动排序:表格行可以通过拖动进行位置调换,且具有动画效果。

SortableJS 的特点包括:

  • 轻量级:体积小巧,仅有几 KB,不会对页面性能造成太大影响。
  • 易于使用:使用简单,只需要几行代码即可实现拖拽排序功能。
  • 功能强大:支持多种拖拽排序场景,包括容器内项目拖动排序、容器间项目拖动排序、表格行拖动排序等。
  • 可定制:支持多种自定义选项,如拖拽元素的外观、动画效果等。

SortableJS 的原理

SortableJS 的原理是利用 HTML5 的拖拽 API 来实现拖拽排序功能。HTML5 的拖拽 API 包括以下几个事件:

  • dragstart:当拖拽操作开始时触发。
  • drag:当拖拽元素移动时触发。
  • dragend:当拖拽操作结束时触发。
  • drop:当拖拽元素被放置到某个位置时触发。

SortableJS 通过监听这些事件来实现拖拽排序功能。当拖拽操作开始时,SortableJS 会将拖拽元素的原始位置存储起来。当拖拽元素移动时,SortableJS 会根据拖拽元素的当前位置和原始位置来计算出拖拽元素的位移。当拖拽元素被放置到某个位置时,SortableJS 会将拖拽元素放置到该位置,并更新拖拽元素的原始位置。

SortableJS 的实现源码分析

SortableJS 的实现源码相对简单,主要包括以下几个部分:

  • Sortable 类:这是 SortableJS 的核心类,它负责处理拖拽操作的逻辑。
  • Draggable 类:这是 SortableJS 的另一个类,它负责处理单个拖拽元素的逻辑。
  • utils.js 文件:这个文件包含一些 SortableJS 使用的工具函数。

Sortable

Sortable 类是 SortableJS 的核心类,它负责处理拖拽操作的逻辑。Sortable 类包含以下几个主要方法:

  • constructor:构造函数,负责初始化 SortableJS 实例。
  • bindEventListeners:绑定事件监听器。
  • dispatchEvent:分发事件。
  • addSortable:添加一个可排序的容器。
  • removeSortable:移除一个可排序的容器。
  • serialize:将可排序的容器中的元素序列化成一个字符串。
  • destroy:销毁 SortableJS 实例。

Draggable

Draggable 类是 SortableJS 的另一个类,它负责处理单个拖拽元素的逻辑。Draggable 类包含以下几个主要方法:

  • constructor:构造函数,负责初始化 Draggable 实例。
  • bindEventListeners:绑定事件监听器。
  • dispatchEvent:分发事件。
  • onDragStart:当拖拽操作开始时触发。
  • onDrag:当拖拽元素移动时触发。
  • onDragEnd:当拖拽操作结束时触发。
  • onDrop:当拖拽元素被放置到某个位置时触发。
  • destroy:销毁 Draggable 实例。

utils.js 文件

utils.js 文件包含一些 SortableJS 使用的工具函数,包括:

  • extend:扩展一个对象。
  • delegate:委托事件处理。
  • closest:查找最近的父元素。
  • offset:获取元素的偏移量。
  • supportPointerEvents:判断浏览器是否支持 Pointer Events。

SortableJS 的使用

SortableJS 的使用非常简单,只需要几行代码即可实现拖拽排序功能。以下是一个示例:

var sortable = new Sortable(element, {
  // 配置选项
});

在上面的示例中,element 是要实现拖拽排序的容器,sortable 是 SortableJS 实例。sortable 实例可以通过 addSortableremoveSortable 方法来添加和移除可排序的容器。sortable 实例还可以通过 serialize 方法将可排序的容器中的元素序列化成一个字符串。

SortableJS 提供了多种配置选项,可以根据需要进行配置。以下是一些常用的配置选项:

  • ghostClass:拖拽元素的幽灵类名。
  • animation:动画效果。
  • fallbackTolerance:回退容差。
  • filter:过滤函数。
  • handle:拖拽句柄。
  • onEnd:拖拽结束时的回调函数。
  • onStart:拖拽开始时的回调函数。

结语

SortableJS 是一款轻量级、易于使用且功能强大的 JS 拖拽排序库,非常适合需要实现拖拽排序功能的开发者使用。SortableJS 的原理是利用 HTML5 的拖拽 API 来实现拖拽排序功能,其实现源码相对简单,主要包括 Sortable 类、Draggable 类和 utils.js 文件。SortableJS 的使用非常简单,只需要几行代码即可实现拖拽排序功能。