SortableJS API 文档

1,622 阅读6分钟

快速开始

快速开始 使用 NPM 安装:

npm install sortablejs --save

使用 Bower 安装:

bower install --save sortablejs

导入到您的项目中:

// 默认的 SortableJS
import Sortable from 'sortablejs';

// 核心 SortableJS (不含默认插件)
import Sortable from 'sortablejs/modular/sortable.core.esm.js';

// 完整的 SortableJS (包含所有插件)
import Sortable from 'sortablejs/modular/sortable.complete.esm.js';

挑选插件:

// 挑选额外的插件
import Sortable, { MultiDrag, Swap } from 'sortablejs';

Sortable.mount(new MultiDrag(), new Swap());

// 挑选默认插件
import Sortable, { AutoScroll } from 'sortablejs/modular/sortable.core.esm.js';

Sortable.mount(new AutoScroll());

用法

<ul id="items">
    <li>项目 1</li>
    <li>项目 2</li>
    <li>项目 3</li>
</ul>
var el = document.getElementById('items');
var sortable = Sortable.create(el,Options);

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

📋 配置项 (Options)

基础配置

配置项类型默认值说明
groupString/Object"default"分组名称,相同分组可以互相拖拽
sortBooleantrue是否允许在列表内排序
disabledBooleanfalse是否禁用拖拽功能
storeObjectnull存储配置,用于保存和恢复排序状态
animationNumber0动画持续时间(毫秒)
easingStringnull动画缓动函数,如 "cubic-bezier(1, 0, 0, 1)"
handleStringnull拖拽手柄选择器,只有点击此元素才能拖拽
filterString/Functionnull过滤器,匹配的元素不可拖拽
preventOnFilterBooleantrue触发过滤器时是否阻止默认事件
draggableStringnull可拖拽元素的选择器
dataIdAttrString"data-id"元素ID的数据属性名
ghostClassString"sortable-ghost"拖拽占位符的CSS类名
chosenClassString"sortable-chosen"被选中元素的CSS类名
dragClassString"sortable-drag"拖拽中元素的CSS类名
swapThresholdNumber1交换阈值,0-1之间的值
invertSwapBooleanfalse是否反转交换逻辑
invertedSwapThresholdNumbernull反转交换的阈值
directionStringnull排序方向:"vertical"、"horizontal" 或自动检测
forceFallbackBooleanfalse强制使用HTML5拖拽的备用方案
fallbackClassString"sortable-fallback"备用拖拽元素的CSS类名
fallbackOnBodyBooleanfalse将备用元素附加到body
fallbackToleranceNumber0备用模式下的鼠标移动容差(像素)
fallbackOffsetObject{x: 0, y: 0}备用元素的偏移量
supportPointerBooleantrue是否支持Pointer Events
emptyInsertThresholdNumber5空容器的插入阈值(像素)

滚动相关配置

配置项类型默认值说明
scrollBoolean/Elementtrue是否启用自动滚动
scrollFnFunctionnull自定义滚动函数
scrollSensitivityNumber30触发滚动的边距(像素)
scrollSpeedNumber10滚动速度
bubbleScrollBooleantrue是否允许滚动冒泡到父容器
forceAutoScrollFallbackBooleanfalse强制使用自动滚动的备用方案

多选相关配置

配置项类型默认值说明
multiDragBooleanfalse是否启用多选拖拽
selectedClassString"sortable-selected"选中项的CSS类名
multiDragKeyStringnull多选按键:"ctrl"、"alt"、"shift"
avoidImplicitDeselectBooleanfalse避免隐式取消选择

分组配置详细说明

group 为对象时,可以包含以下属性:

group: {
    name: "shared",        // 分组名称
    pull: true,           // 是否可以从此列表拖拽出元素 (true/false/function/"clone")
    put: true,            // 是否可以放入元素到此列表 (true/false/function/array)
    revertClone: false    // 克隆模式下是否还原克隆元素
}

🛠️ 方法 (Methods)

实例方法

方法名参数返回值说明
option(name, value?)name: String, value?: AnyAny获取或设置配置项
closest(el, selector?)el: Element, selector?: StringElement查找最近的匹配元素
toArray()-String[]获取元素的data-id数组 可通过配置项dataIdAttr修改放入一个数组,并返回这个数组中
sort(order, useAnimation?)order: String[], useAnimation?: Booleanvoid按指定顺序排序元素
save()-void保存当前排序状态
destroy()-void销毁Sortable实例

静态方法

方法名参数返回值说明
Sortable.create(el, options?)el: Element, options?: ObjectSortable创建Sortable实例
Sortable.get(el)el: ElementSortable获取元素的Sortable实例
Sortable.mount(...plugins)...plugins: Plugin[]void挂载插件
Sortable.utils-Object实用工具集合

工具方法 (Sortable.utils)

方法名参数返回值说明
on(el, event, fn)el: Element, event: String, fn: Functionvoid添加事件监听器
off(el, event, fn)el: Element, event: String, fn: Functionvoid移除事件监听器
css(el, prop, val?)el: Element, prop: String, val?: StringString/void获取或设置CSS属性
find(ctx, tagName, iterator?)ctx: Element, tagName: String, iterator?: FunctionElement[]查找子元素
bind(ctx, fn)ctx: Object, fn: FunctionFunction绑定上下文
is(el, selector)el: Element, selector: StringBoolean检查元素是否匹配选择器
closest(el, selector, ctx?)el: Element, selector: String, ctx?: ElementElement查找最近的匹配祖先元素
clone(el)el: ElementElement克隆元素
toggleClass(el, name, state?)el: Element, name: String, state?: Booleanvoid切换CSS类
detectDirection(el)el: ElementString检测排列方向

📢 事件 (Events)

拖拽生命周期事件

事件名触发时机参数说明
onChoose选择元素开始拖拽时evt.oldIndex - 原始索引
onUnchoose取消选择元素时evt.oldIndex - 原始索引
onStart开始拖拽时evt.oldIndex - 原始索引
onEnd拖拽结束时evt.oldIndex - 原始索引 evt.newIndex - 新索引
onAdd元素被添加到列表时evt.newIndex - 新索引 evt.item - 被添加的元素
onUpdate元素在列表内移动时evt.oldIndex - 原始索引 evt.newIndex - 新索引
onSort任何排序发生时evt.oldIndex - 原始索引 evt.newIndex - 新索引
onRemove元素被移除时evt.oldIndex - 原始索引 evt.item - 被移除的元素
onFilter尝试拖拽被过滤的元素时evt.item - 被过滤的元素
onMove拖拽移动过程中evt.dragged - 被拖拽的元素 evt.draggedRect - 拖拽元素的位置信息 evt.related - 相关元素 evt.relatedRect - 相关元素的位置信息 evt.willInsertAfter - 是否在后面插入
onClone克隆元素时evt.item - 原始元素 evt.clone - 克隆的元素
onChange拖拽导致列表改变时evt.newIndex - 新索引 evt.oldIndex - 原始索引

事件对象属性详解

每个事件回调函数都会接收一个事件对象,包含以下属性:

{
    to: HTMLElement,        // 目标列表元素
    from: HTMLElement,      // 源列表元素
    item: HTMLElement,      // 被拖拽的元素
    clone: HTMLElement,     // 克隆的元素(如果有)
    oldIndex: Number,       // 在源列表中的索引
    newIndex: Number,       // 在目标列表中的索引
    oldDraggableIndex: Number, // 在可拖拽元素中的索引
    newDraggableIndex: Number, // 在可拖拽元素中的新索引
    pullMode: String,       // 拉取模式 ("clone"/"true")
    originalEvent: Event    // 原始浏览器事件
}

💡 使用示例

基础配置示例

var sortable = Sortable.create(document.getElementById('items'), {
    // 基础配置
    group: 'shared',
    animation: 150,
    
    // 样式类名
    ghostClass: 'sortable-ghost',
    chosenClass: 'sortable-chosen',
    dragClass: 'sortable-drag',
    
    // 拖拽限制
    handle: '.drag-handle',
    filter: '.no-drag',
    
    // 滚动配置
    scroll: true,
    scrollSensitivity: 30,
    scrollSpeed: 10,
    
    // 事件处理
    onStart: function(evt) {
        console.log('开始拖拽:', evt.oldIndex);
    },
    
    onEnd: function(evt) {
        console.log('拖拽结束:', evt.oldIndex, '->', evt.newIndex);
    },
    
    onMove: function(evt) {
        // 自定义移动逻辑
        return true; // 返回false阻止移动
    }
});

高级分组配置示例

// 源列表(只能拖出,不能拖入)
Sortable.create(sourceList, {
    group: {
        name: 'shared',
        pull: 'clone',    // 克隆模式拖出
        put: false        // 不允许拖入
    }
});

// 目标列表(只能拖入,不能拖出)
Sortable.create(targetList, {
    group: {
        name: 'shared',
        pull: false,      // 不允许拖出
        put: true         // 允许拖入
    }
});

方法调用示例

// 获取排序数组
var order = sortable.toArray();

// 按指定顺序排序
sortable.sort(['item-1', 'item-3', 'item-2']);

// 获取配置项
var animationDuration = sortable.option('animation');

// 设置配置项
sortable.option('disabled', true);

// 销毁实例
sortable.destroy();

🔌 插件系统

SortableJS 支持插件扩展,常用插件包括:

  • MultiDrag - 多选拖拽插件
  • Swap - 交换模式插件
  • AutoScroll - 自动滚动插件
// 加载插件
Sortable.mount(new MultiDragPlugin(), new SwapPlugin());

// 使用插件功能
var sortable = Sortable.create(el, {
    multiDrag: true,
    selectedClass: 'selected'
});

📝 注意事项

  1. 性能优化:对于大量元素,建议使用虚拟滚动或分页
  2. 移动端适配:在移动设备上可能需要设置 forceFallback: true
  3. 内存管理:记得在不需要时调用 destroy() 方法
  4. 事件冒泡:注意事件可能会冒泡,需要适当处理
  5. CSS样式:确保拖拽相关的CSS类有正确的样式定义