SortableJS — это современная JavaScript-библиотека, обеспечивающая
перетаскивание элементов внутри списка или между списками с высокой
производительностью и гибкой конфигурацией. Основной объект, управляющий
сортировкой, создаётся через конструктор Sortable, которому
передаётся DOM-элемент и объект с опциями.
const sortable = new Sortable(listElement, {
animation: 150,
handle: '.handle',
ghostClass: 'ghost'
});
Ключевые моменты конфигурации:
animation — время анимации перестановки элементов в
миллисекундах. Позволяет сгладить визуальный эффект перемещения.handle — CSS-селектор, задающий «ручку», за которую
можно тянуть элемент. Без указания этого параметра весь элемент
становится захватываемым.ghostClass — CSS-класс, применяемый к элементу-призраку
во время перетаскивания.SortableJS предоставляет широкий набор событий для управления поведением и внешним видом элементов.
Основные события:
onStart — срабатывает при начале перетаскивания.onEnd — срабатывает по завершении перемещения, даже
если элемент вернулся на исходную позицию.onAdd — вызывается, когда элемент добавляется в другой
список.onUpdate — срабатывает при изменении позиции элемента
внутри текущего списка.onRemove — вызывается при удалении элемента из
списка.onSort — срабатывает при каждом изменении порядка
элементов.Пример использования события:
new Sortable(listElement, {
onEnd: function (evt) {
console.log(`Элемент ${evt.item.textContent} перемещён с позиции ${evt.oldIndex} на позицию ${evt.newIndex}`);
}
});
Полезная информация о событиях:
evt) содержит свойства
item, from, to,
oldIndex, newIndex.SortableJS поддерживает плагины, которые добавляют дополнительные возможности:
Подключение плагинов:
Sortable.mount(new Sortable.AutoScroll(), new Sortable.MultiDrag());
После подключения плагинов их поведение можно настроить через опции:
const sortable = new Sortable(listElement, {
multiDrag: true,
selectedClass: 'selected',
autoScroll: true,
scrollSensitivity: 30,
scrollSpeed: 10
});
Объяснение опций плагинов:
selectedClass — CSS-класс для выделенных элементов при
MultiDrag.scrollSensitivity — минимальное расстояние до края
контейнера, при котором начинается автопрокрутка.scrollSpeed — скорость прокрутки при срабатывании
AutoScroll.SortableJS позволяет ограничивать перетаскивание элементов с помощью фильтров и групп:
filter — CSS-селектор элементов, которые нельзя
перемещать.preventOnFilter — предотвращает стандартное поведение
браузера при попытке перемещения заблокированных элементов.group — управляет доступом к другим спискам. Можно
указать имя группы и направление взаимодействия (pull,
put).Пример конфигурации фильтров и групп:
new Sortable(listElement, {
filter: '.disabled',
preventOnFilter: true,
group: {
name: 'shared',
pull: 'clone',
put: true
}
});
.disabled нельзя перетаскивать.shared позволяет обмениваться элементами между
списками с клонированием.SortableJS предоставляет гибкую настройку стилей при перемещении элементов:
ghostClass — стиль «призрака» во время
перетаскивания.chosenClass — CSS-класс для активного элемента, за
который берутся.dragClass — класс, применяемый к элементу во время
фактического перетаскивания.fallbackClass — класс для элементов, если браузер не
поддерживает нативное перетаскивание.new Sortable(listElement, {
ghostClass: 'ghost',
chosenClass: 'chosen',
dragClass: 'dragging',
fallbackClass: 'fallback'
});
Эти классы дают возможность полностью контролировать визуальное оформление и реакцию интерфейса.
SortableJS предоставляет методы для программного управления списками:
toArray() — возвращает массив идентификаторов
элементов.sort(order) — сортирует элементы по переданному массиву
идентификаторов.save() и destroy() — сохраняет текущее
состояние и уничтожает объект сортировки.option(name, value) — получает или изменяет опцию на
лету.sortable.option('animation', 200);
const order = sortable.toArray();
sortable.sort(['item3', 'item1', 'item2']);
Использование этих методов позволяет создавать динамические интерфейсы с изменяемым поведением без перезагрузки страницы.
SortableJS легко интегрируется с React, Vue и Angular, сохраняя
основной принцип работы через DOM-элементы и события. Для React и Vue
существуют специальные обёртки (react-sortablejs,
vue.draggable), которые упрощают связывание состояния
компонентов с порядком элементов.