SortableJS — это библиотека для реализации перетаскивания элементов списков и сеток в браузере на чистом JavaScript. Она позволяет создавать интерактивные списки с возможностью сортировки, перемещения между контейнерами, а также поддерживает сложные сценарии с анимацией и событиями. Основными преимуществами являются простота интеграции, гибкость конфигурации и кроссбраузерная совместимость.
Для работы с библиотекой можно использовать CDN или пакетный менеджер npm:
<script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
или
npm install sortablejs
После подключения можно создать новый объект Sortable для выбранного контейнера:
const el = document.getElementById('items');
const sortable = new Sortable(el, {
animation: 150,
ghostClass: 'sortable-ghost'
});
Ключевые параметры:
animation — задает плавность перемещения элементов (в
миллисекундах).ghostClass — CSS-класс для элемента, который
отображается во время перетаскивания.handle — позволяет задать область элемента, с которой
можно начать перетаскивание.draggable — селектор элементов, которые могут быть
перетащены.SortableJS предоставляет набор событий, которые позволяют отслеживать действия пользователя и изменять поведение списка:
onStart — срабатывает в момент начала
перетаскивания.onEnd — срабатывает после завершения перемещения
элемента.onAdd — вызывается, когда элемент добавляется в другой
список.onRemove — вызывается при удалении элемента из
списка.onUpdate — срабатывает после изменения порядка внутри
списка.onSort — общее событие сортировки, срабатывающее при
любом изменении позиции элемента.Пример использования события onEnd:
sortable.option('onEnd', function (evt) {
console.log(`Элемент перемещен с позиции ${evt.oldIndex} на ${evt.newIndex}`);
});
SortableJS поддерживает работу с несколькими контейнерами. Для этого
достаточно передать массив элементов в параметр group:
const listA = document.getElementById('listA');
const listB = document.getElementById('listB');
new Sortable(listA, {
group: 'shared',
animation: 150
});
new Sortable(listB, {
group: 'shared',
animation: 150
});
Параметр group можно настроить более детально:
name — имя группы.pull — позволяет контролировать, можно ли перемещать
элемент из списка (значения true, false или
функция).put — позволяет определять, можно ли добавлять элемент
в список.Для плавной работы интерфейса важно правильно настроить стили:
.sortable-ghost {
opacity: 0.4;
background-color: #f0f0f0;
}
.sortable-chosen {
background-color: #d0d0ff;
}
.sortable-drag {
box-shadow: 0 4px 8px rgba(0,0,0,0.2);
}
sortable-ghost — элемент-призрак во время
перемещения.sortable-chosen — элемент, который пользователь
выбрал.sortable-drag — активный элемент во время
перетаскивания.Для сохранения порядка элементов в форме можно использовать скрытые поля:
<ul id="tasks">
<li data-id="1">Задача 1</li>
<li data-id="2">Задача 2</li>
</ul>
<input type="hidden" name="task_order" id="task_order">
sortable.option('onEnd', function (evt) {
const order = sortable.toArray();
document.getElementById('task_order').value = order.join(',');
});
Метод toArray() возвращает массив id
элементов в текущем порядке, что позволяет отправлять данные на
сервер.
animation с разумным временем (100–200
мс) делает интерфейс плавным, не перегружая браузер.SortableJS поддерживает мобильные платформы с сенсорным управлением. Для оптимальной работы следует учитывать:
touchStartThreshold — минимальное расстояние перед
началом перетаскивания на сенсорных устройствах.sort() — сортирует элементы по заданному критерию.save() — сохраняет текущее состояние сортировки (часто
используется с localStorage).destroy() — удаляет Sortable с элемента, очищая
обработчики событий.Пример сохранения порядка в localStorage:
sortable.option('onEnd', function () {
localStorage.setItem('order', JSON.stringify(sortable.toArray()));
});
window.addEventListener('load', function () {
const savedOrder = JSON.parse(localStorage.getItem('order'));
if (savedOrder) {
savedOrder.forEach(id => {
const el = document.querySelector(`[data-id="${id}"]`);
el && el.parentNode.appendChild(el);
});
}
});
SortableJS можно расширять с помощью плагинов:
Пример включения MultiDrag:
Sortable.mount(new Sortable.MultiDrag());
const multiSortable = new Sortable(document.getElementById('multi'), {
multiDrag: true,
selectedClass: 'selected',
animation: 150
});
id для элементов, чтобы
корректно работать с методами toArray() и
sort().sortable.option('draggable', 'li') после вставки новых
элементов.SortableJS обеспечивает мощный и гибкий инструмент для управления списками, позволяя создавать интуитивно понятные интерфейсы с минимальными усилиями.