SortableJS — это современная библиотека на JavaScript, обеспечивающая
возможность перетаскивания элементов списка (drag-and-drop) с
сохранением порядка. Основной объект библиотеки создается через
конструктор Sortable, который привязывается к DOM-элементу
контейнера, содержащего элементы для сортировки.
import Sortable from 'sortablejs';
const list = document.getElementById('sortable-list');
const sortable = new Sortable(list, {
animation: 150,
ghostClass: 'sortable-ghost',
});
Ключевые параметры конфигурации:
animation — задает продолжительность анимации при
перемещении элементов в миллисекундах.ghostClass — CSS-класс, применяемый к элементу-призраку
во время перетаскивания.handle — позволяет ограничить область, с которой можно
начать перетаскивание.draggable — определяет, какие дочерние элементы
контейнера можно перемещать.onEnd, onStart, onAdd,
onUpdate — события жизненного цикла сортировки, вызываемые
в разные моменты взаимодействия.SortableJS может работать с любыми HTML-элементами. Чаще всего
применяются <ul> и <li>, однако
поддерживаются и <div> с внутренними элементами.
Элементы можно сортировать в пределах одного контейнера или между
несколькими контейнерами.
<ul id="sortable-list">
<li>Элемент 1</li>
<li>Элемент 2</li>
<li>Элемент 3</li>
</ul>
new Sortable(document.getElementById('sortable-list'), {
animation: 200,
handle: '.handle',
draggable: 'li',
onEnd: function (evt) {
console.log(`Элемент перемещён с позиции ${evt.oldIndex} на ${evt.newIndex}`);
}
});
Особенности работы с индексами:
oldIndex — исходная позиция элемента.newIndex — новая позиция после перетаскивания.evt.item — ссылка на DOM-элемент, который был
перемещен.SortableJS позволяет перемещать элементы между разными списками с сохранением состояния и обработкой событий.
const lists = document.querySelectorAll('.sortable-container');
lists.forEach(list => {
new Sortable(list, {
group: 'shared',
animation: 150,
onAdd: function(evt) {
console.log('Элемент добавлен в список:', evt.to.id);
}
});
});
Параметр group:
group, элементы можно перемещать между ними.pull и put задают направление перемещения:
pull: 'clone' позволяет копировать элементы,
put: false запрещает вставку.SortableJS предоставляет гибкий набор событий для интеграции с бизнес-логикой:
onStart — вызывается при начале перетаскивания.onEnd — вызывается после завершения перемещения
элемента.onAdd — элемент был добавлен в новый контейнер.onUpdate — элемент изменил позицию в пределах
контейнера.onRemove — элемент удален из контейнера.onSort — любое изменение порядка элементов внутри
контейнера.Каждое событие получает объект evt с подробной
информацией о перемещении, включая item, from,
to, oldIndex, newIndex.
SortableJS не навязывает стили, но предоставляет базовые возможности для визуализации процесса перетаскивания:
Пример CSS:
.sortable-ghost {
opacity: 0.4;
}
.sortable-chosen {
background-color: #f0f0f0;
}
SortableJS поддерживает динамическое добавление и удаление элементов из DOM. После добавления нового элемента достаточно обновить контейнер, чтобы библиотека корректно его обработала.
const list = document.getElementById('sortable-list');
const newItem = document.createElement('li');
newItem.textContent = 'Новый элемент';
list.appendChild(newItem);
sortable.addEventListener('onUpdate', () => console.log('Список обновлен'));
SortableJS предоставляет методы для управления состоянием:
toArray() — возвращает массив идентификаторов элементов
в текущем порядке.sort(orderArray) — сортирует элементы согласно
переданному массиву.save() и destroy() — сохраняет состояние и
полностью удаляет экземпляр библиотеки.option(name, value) — динамическая смена опций после
инициализации.SortableJS легко интегрируется с React, Vue и Angular. Для этого
существуют официальные обертки (react-sortablejs,
vuedraggable), которые используют нативный API библиотеки.
Ключевой момент — работа с состоянием данных и синхронизация их с DOM
после сортировки.
SortableJS обеспечивает мощные возможности управления перетаскиванием и сортировкой элементов, поддерживает множество конфигураций, динамических списков и интеграцию с фреймворками. Гибкость событийной системы и методов API позволяет создавать сложные интерфейсы с сохранением порядка элементов и удобной визуальной анимацией.