SortableJS — это мощная JavaScript-библиотека для реализации перетаскивания и динамической сортировки элементов на веб-странице. Она позволяет создавать интерактивные списки, сетки и коллекции, обеспечивая высокую гибкость в управлении поведением элементов.
Библиотека работает через создание экземпляра Sortable
на выбранном контейнере DOM, внутри которого располагаются элементы для
сортировки. Основная цель — управление порядком элементов и обработка
событий, связанных с их перемещением.
import Sortable from 'sortablejs';
const list = document.getElementById('sortable-list');
const sortable = new Sortable(list, {
animation: 150,
ghostClass: 'sortable-ghost',
chosenClass: 'sortable-chosen',
});
animation — определяет длительность
анимации перемещения элементов.ghostClass — CSS-класс для
элемента-призрака, отображаемого при перетаскивании.chosenClass — CSS-класс для элемента,
который пользователь захватил.Сортировка элементов в SortableJS строится на управлении порядком элементов DOM. После инициализации сортировки, библиотека отслеживает движение мыши и динамически переставляет элементы.
Для управления порядком элементов применяются следующие свойства и методы:
set — позволяет программно установить
порядок элементов.toArray — возвращает массив
идентификаторов элементов в текущем порядке.sort — метод, который позволяет задать
пользовательскую функцию сортировки элементов.Пример получения текущего порядка элементов:
const currentOrder = sortable.toArray();
console.log(currentOrder);
Здесь каждый элемент должен иметь уникальный атрибут
data-id, который используется библиотекой для
идентификации:
<ul id="sortable-list">
<li data-id="1">Элемент 1</li>
<li data-id="2">Элемент 2</li>
<li data-id="3">Элемент 3</li>
</ul>
sort и пользовательские функции сортировкиМетод sort в SortableJS позволяет вручную задавать
порядок элементов, используя стандартный подход JavaScript с функцией
сравнения. Он принимает функцию, возвращающую порядок элементов по
определённым критериям.
Пример сортировки по текстовому содержимому элементов:
sortable.sort((a, b) => {
const textA = a.textContent.trim().toLowerCase();
const textB = b.textContent.trim().toLowerCase();
if (textA < textB) return -1;
if (textA > textB) return 1;
return 0;
});
Особенности метода sort:
HTMLElement, а не их значения напрямую.SortableJS предоставляет широкий набор событий, позволяющих контролировать процесс сортировки:
onStart — вызывается при начале
перетаскивания элемента.onEnd — вызывается после завершения
сортировки, когда элемент отпущен.onUpdate — срабатывает при изменении
порядка элементов внутри контейнера.onAdd / onRemove —
используются при перемещении элементов между разными списками.Пример:
const sortable = new Sortable(list, {
animation: 150,
onEnd: (evt) => {
console.log(`Элемент ${evt.item.textContent} перемещён с позиции ${evt.oldIndex} на ${evt.newIndex}`);
}
});
События дают возможность синхронизировать изменения с сервером или локальной базой данных, обновляя порядок элементов без перезагрузки страницы.
SortableJS поддерживает следующие ключевые функции:
group) —
позволяет перемещать элементы между несколькими списками.filter) —
исключает определённые элементы из сортировки.axis)
— позволяет перемещать элементы только горизонтально или
вертикально.Пример ограниченной сортировки по вертикали с исключением элементов:
new Sortable(list, {
animation: 150,
axis: 'y',
filter: '.no-drag',
onMove: (evt) => {
return !evt.related.classList.contains('no-drag');
}
});
SortableJS легко интегрируется с React, Vue и Angular. В случае React
обычно используется обёртка react-sortablejs, которая
обеспечивает корректное управление состоянием компонентов:
import { ReactSortable } from "react-sortablejs";
const items = [
{ id: 1, name: "Элемент 1" },
{ id: 2, name: "Элемент 2" }
];
<ReactSortable list={items} setList={setItems}>
{items.map(item => <div key={item.id}>{item.name}</div>)}
</ReactSortable>
Это позволяет синхронизировать порядок элементов с состоянием приложения, что критично при динамических интерфейсах.
onUpdate и onEnd для
синхронизации порядка элементов с внешними источниками данных.SortableJS предоставляет гибкую и надёжную систему сортировки, которая масштабируется от простых списков до сложных интерфейсов с множеством контейнеров и динамическими элементами.