SortableJS — это мощная библиотека на JavaScript, позволяющая
реализовывать перетаскивание элементов списка и их сортировку с
минимальными усилиями. Библиотека поддерживает как простые списки
<ul>/<ol>, так и сложные структуры
с вложенными элементами. Основной объект библиотеки создается через
конструктор Sortable, которому передается контейнер и набор
опций.
import Sortable from 'sortablejs';
const list = document.getElementById('my-list');
const sortable = new Sortable(list, {
animation: 150,
ghostClass: 'sortable-ghost',
handle: '.handle'
});
animation — задает плавность
перемещения элементов.ghostClass — CSS-класс для элемента,
который визуально перетаскивается.handle — определяет область, за
которую можно захватывать элемент для перетаскивания.Создание перетаскиваемого списка начинается с выбора контейнера. Элементы внутри контейнера автоматически становятся сортируемыми. Важно понимать различие между контейнером и элементами списка: контейнер отвечает за порядок элементов, а элементы — за содержимое.
<ul id="task-list">
<li class="task-item">Задача 1</li>
<li class="task-item">Задача 2</li>
<li class="task-item">Задача 3</li>
</ul>
Подключение SortableJS позволяет менять порядок
<li> перетаскиванием, а дополнительные параметры дают
возможность управлять поведением: ограничивать перетаскивание, задавать
визуальные эффекты, связывать несколько списков.
SortableJS предоставляет широкий набор событий, которые позволяют интегрировать логику валидации и обработки данных:
onStart — срабатывает при начале
перетаскивания.onEnd — вызывается после завершения
перетаскивания.onAdd — срабатывает при добавлении
элемента в список (например, между связанными списками).onUpdate — вызывается при изменении
порядка элементов в текущем списке.onRemove — срабатывает при удалении
элемента из списка.onSort — вызывается при любом
изменении позиции элементов, включая перетаскивание.Эти события критичны для реализации валидации на клиентской стороне, так как позволяют перехватывать момент изменения данных и проверять корректность новых состояний.
sortable.option("onEnd", function(evt) {
const movedItem = evt.item;
console.log("Элемент перемещен:", movedItem.textContent);
});
Для контроля над действиями пользователя применяются следующие механизмы:
filter — позволяет исключить элементы
из сортировки. Пример: кнопки удаления внутри элементов списка.new Sortable(list, {
filter: '.non-draggable',
onFilter: function(evt) {
console.log('Элемент не может быть перемещен:', evt.item);
}
});
disabled — блокировка всей сортировки
для конкретного списка.handle — ограничение зоны захвата
элемента, предотвращающее случайное перетаскивание.group — объединение списков в одну
группу для обмена элементами, с возможностью настройки правил добавления
и удаления.SortableJS сам по себе не выполняет валидацию данных, однако события и фильтры позволяют встроить проверки непосредственно в процесс сортировки. Например, можно проверять:
sortable.option("onEnd", function(evt) {
const index = evt.newIndex;
const item = evt.item;
if (index === 0 && !item.classList.contains('priority')) {
alert("Только элементы с приоритетом могут быть перемещены на первую позицию");
sortable.sort([...evt.from.children].map(el => el)); // возвращение к исходному порядку
}
});
Такой подход обеспечивает мгновенную обратную связь пользователю и предотвращает некорректные изменения на клиенте до отправки данных на сервер.
SortableJS поддерживает создание понятного и приятного интерфейса:
Эти элементы визуализации повышают удобство взаимодействия и делают клиентскую валидацию более очевидной, так как пользователь сразу видит, какие действия разрешены, а какие запрещены.
Использование группы (group) позволяет объединять
несколько списков, поддерживая возможность перемещения элементов между
ними. Опции группы включают:
pull — разрешает или запрещает
вытаскивание элементов из списка.put — разрешает или запрещает
добавление элементов в список.revertOnSpill — возвращает элемент на
исходное место, если он отпущен вне списка.new Sortable(listA, {
group: { name: 'shared', pull: 'clone', put: false },
});
new Sortable(listB, {
group: 'shared',
});
Это позволяет реализовать сложные сценарии с проверкой условий перемещения и соблюдением бизнес-логики.
SortableJS предоставляет методы для управления списком без прямого вмешательства в DOM:
sort() — программное изменение порядка
элементов.toArray() — получение массива
идентификаторов элементов для синхронизации с сервером.destroy() — удаление функционала
сортировки.Эти методы особенно полезны при валидации: можно программно откатить некорректные действия или сохранить состояние списка перед изменением.
Эта структура позволяет реализовывать интерактивные, динамичные интерфейсы с полной клиентской проверкой корректности операций. Комбинация событий, фильтров и программных методов делает SortableJS инструментом для построения надежной и безопасной логики перетаскивания элементов.