SortableJS — это мощная и гибкая библиотека на JavaScript, предназначенная для реализации функционала перетаскивания элементов внутри списка или между списками. Она позволяет создавать интерактивные интерфейсы с поддержкой drag-and-drop, минимизируя количество собственного кода и обеспечивая широкие возможности настройки.
Для создания сортируемого списка достаточно подключить библиотеку и
инициализировать Sortable на выбранном DOM-элементе:
import Sortable from 'sortablejs';
const list = document.getElementById('items');
Sortable.create(list, {
animation: 150,
ghostClass: 'sortable-ghost',
});
Ключевые параметры:
animation — время анимации перемещения элемента в
миллисекундах.ghostClass — CSS-класс, который применяется к элементу
во время перетаскивания.handle — позволяет задать только часть элемента для
захвата перетаскивания.draggable — селектор элементов, которые можно
перетаскивать внутри контейнера.SortableJS предоставляет ряд методов для динамического управления списком после его создания:
toArray() — возвращает массив
идентификаторов элементов в текущем порядке.
const order = sortable.toArray();
console.log(order); // ['item1', 'item3', 'item2']
Применение: полезно для синхронизации состояния интерфейса с сервером.
sort(order) — переставляет элементы
в контейнере согласно переданному массиву идентификаторов.
sortable.sort(['item3', 'item1', 'item2']);
Важно: идентификаторы элементов должны совпадать с
атрибутами id или data-id.
add() и remove() —
методы для добавления и удаления элементов программно, при этом Sortable
автоматически учитывает их в текущем порядке.
destroy() — удаляет функционал
сортировки с контейнера, оставляя элементы на месте.
save() и load() —
вспомогательные методы, позволяющие сохранять порядок элементов в
localStorage и восстанавливать его после перезагрузки
страницы.
Для динамической работы с обновленным списком ключевым является
событие onEnd, которое срабатывает после завершения
перетаскивания:
Sortable.create(list, {
onEnd: function (evt) {
console.log('Элемент перемещен:', evt.item);
console.log('Новый порядок:', sortable.toArray());
}
});
Параметры события:
evt.oldIndex — исходная позиция элемента.evt.newIndex — новая позиция элемента.evt.item — сам DOM-элемент, который был перемещен.evt.from и evt.to — контейнеры источника и
назначения при переносе между списками.Для сложных интерфейсов можно объединять события onAdd,
onUpdate и onRemove, чтобы отслеживать
изменения при добавлении, обновлении и удалении элементов. Это особенно
важно при синхронизации с сервером через API.
SortableJS позволяет изменять содержимое списка без полной перезагрузки:
const newItem = document.createElement('li');
newItem.id = 'item4';
newItem.textContent = 'Новый элемент';
list.appendChild(newItem);
sortable.option("draggable", "li");
const itemToRemove = document.getElementById('item2');
list.removeChild(itemToRemove);
После внесения изменений можно вызвать sortable.sort()
или использовать toArray() для получения актуального
порядка.
При изменении DOM вне SortableJS (например, через фреймворк или AJAX) необходимо синхронизировать внутреннее состояние библиотеки:
sortable.destroy(); // Удаление старой инициализации
Sortable.create(list, { animation: 150 }); // Повторная инициализация
Альтернативный способ — использовать метод sort() с
новым порядком элементов, чтобы обновить отображение без разрушения
объекта Sortable.
SortableJS поддерживает взаимодействие нескольких списков через опцию
group:
Sortable.create(list1, { group: 'shared', animation: 150 });
Sortable.create(list2, { group: 'shared', animation: 150 });
Элементы могут перемещаться между списками, а события
onAdd и onRemove позволяют отслеживать
перемещения и обновлять данные.
Особенности:
pull и put — управление доступностью
перетаскивания между списками.sort — указывает, можно ли сортировать внутри
контейнера.onEnd в комбинации с
evt.from и evt.to позволяет корректно
обновлять состояние всех связанных списков.Для списков с большим количеством элементов важно:
animation: 0 при массовых обновлениях,
чтобы избежать лагов.virtual rendering при необходимости отрисовки
сотен и тысяч элементов.toArray() и сохранять порядок только при
завершении всех изменений, а не после каждого перемещения, чтобы снизить
нагрузку на браузер.SortableJS сочетает гибкость и простоту интеграции, предоставляя мощные инструменты для обновления списков в реальном времени, управления событиями и синхронизации состояния с сервером. Его возможности позволяют строить сложные интерфейсы с интерактивными списками, минимизируя необходимость написания большого объема кастомного кода.