SortableJS — это легковесная библиотека для организации перетаскиваемых списков на странице. Для начала работы необходимо подключить библиотеку через CDN или установить через npm:
<script src="https://cdn.jsdelivr.net/npm/sortablejs@1.15.0/Sortable.min.js"></script>
или через npm:
npm install sortablejs
Создание экземпляра Sortable происходит с помощью конструктора:
const el = document.getElementById('items');
const sortable = new Sortable(el, {
animation: 150,
});
Ключевые параметры:
animation — скорость анимации при перетаскивании
элементов.handle — элемент, который можно использовать для
захвата перетаскиваемого объекта.draggable — селектор элементов, которые можно
перетаскивать.SortableJS предоставляет гибкую систему событий, позволяющую отслеживать все этапы перетаскивания:
onStart — срабатывает в момент начала
перетаскивания.onEnd — срабатывает при завершении
перетаскивания, даже если позиция не изменилась.onAdd — срабатывает, когда элемент
добавлен в список (полезно при использовании нескольких списков).onUpdate — срабатывает, когда элемент
перемещён внутри одного списка.onRemove — срабатывает, когда элемент
удалён из списка.onSort — срабатывает при любом
изменении порядка элементов, включая перемещения внутри списка.onFilter — вызывается для элементов,
отмеченных фильтром, при попытке их перетаскивания.onMove — позволяет контролировать
возможность перемещения элемента (возвращает true/false).Пример базовой привязки событий:
const sortable = new Sortable(el, {
animation: 150,
onStart: function (evt) {
console.log('Начало перетаскивания:', evt.item);
},
onEnd: function (evt) {
console.log('Завершение перетаскивания:', evt.item);
},
onUpdate: function (evt) {
console.log('Элемент перемещён:', evt.oldIndex, '→', evt.newIndex);
}
});
Все обработчики получают объект события с полезными свойствами:
item — HTML-элемент, который перетаскивается.from — родительский элемент, из которого берется
перетаскиваемый элемент.to — родительский элемент, в который помещён
элемент.oldIndex — исходный индекс элемента.newIndex — новый индекс элемента.clone — клонированный элемент (при использовании
pull в группах).pullMode — режим перемещения при работе с группами
списков.Использование этих данных позволяет динамически обновлять состояние приложения, например, синхронизировать порядок элементов с сервером.
onEnd: function (evt) {
const movedItem = evt.item.textContent;
console.log(`Элемент "${movedItem}" перемещён с позиции ${evt.oldIndex} на ${evt.newIndex}`);
}
SortableJS поддерживает фильтры для ограничения действий пользователя:
const sortable = new Sortable(el, {
filter: '.no-drag',
onFilter: function (evt) {
console.log('Попытка переместить запрещённый элемент:', evt.item);
}
});
Элементы с классом .no-drag не будут перемещаться, но
событие onFilter позволит выполнить дополнительные
действия, например, показать уведомление.
События можно добавлять и удалять после создания экземпляра:
function logUpdate(evt) {
console.log('Элемент обновлён:', evt.item);
}
sortable.option("onUpdate", logUpdate);
// В дальнейшем отключение события:
sortable.option("onUpdate", null);
Это особенно полезно, если нужно временно блокировать или изменять обработку без пересоздания экземпляра.
SortableJS позволяет объединять несколько списков в группы, что
открывает возможности drag-and-drop между ними. Важную роль играют
события onAdd и onRemove:
const listA = document.getElementById('listA');
const listB = document.getElementById('listB');
Sortable.create(listA, {
group: 'shared',
animation: 150,
onAdd: function (evt) {
console.log('Элемент добавлен в список A:', evt.item.textContent);
}
});
Sortable.create(listB, {
group: 'shared',
animation: 150,
onRemove: function (evt) {
console.log('Элемент удалён из списка B:', evt.item.textContent);
}
});
Событие onMove можно использовать для валидации
перемещения между списками:
onMove: function (evt) {
if (evt.to.id === 'listB' && evt.item.dataset.type !== 'allowed') {
return false; // запрещает перемещение
}
return true;
}
SortableJS поддерживает настройку анимаций и классов для визуальной обратной связи:
const sortable = new Sortable(el, {
animation: 200,
ghostClass: 'ghost', // класс для перемещаемого элемента
chosenClass: 'chosen', // класс для элемента в момент захвата
});
Использование этих классов позволяет интегрировать перетаскивание с существующей CSS-анимацией или эффектами.
События SortableJS дают полный контроль над перетаскиванием элементов, позволяя:
Эта гибкость делает библиотеку удобной для сложных интерфейсов с интерактивными списками и многослойными структурами данных.