SortableJS — это современная библиотека для реализации функционала перетаскивания элементов (drag-and-drop) в веб-приложениях на JavaScript. Она позволяет создавать интерактивные списки, таблицы и сетки с возможностью динамического изменения порядка элементов без необходимости сложного взаимодействия с DOM вручную.
Для подключения библиотеки достаточно добавить её через CDN или установить через npm:
<script src="https://cdn.jsdelivr.net/npm/sortablejs@latest/Sortable.min.js"></script>
или через npm:
npm install sortablejs
Чтобы сделать строки таблицы сортируемыми, необходимо выбрать
контейнер <tbody> и создать новый экземпляр
Sortable:
const tableBody = document.querySelector('#myTable tbody');
const sortable = new Sortable(tableBody, {
animation: 150,
handle: '.drag-handle',
ghostClass: 'sortable-ghost',
chosenClass: 'sortable-chosen',
swapThreshold: 0.65,
});
Ключевые параметры:
Для таблиц с множеством колонок часто требуется, чтобы перемещалась вся строка целиком. В таких случаях внутри каждой строки можно добавить отдельный элемент для захвата, например, иконку или специальную ячейку:
<tr>
<td class="drag-handle">☰</td>
<td>Элемент 1</td>
<td>Описание</td>
</tr>
Это предотвращает случайное перемещение при клике по другим ячейкам таблицы и повышает UX.
SortableJS предоставляет обширный набор событий, позволяющих отслеживать процесс перетаскивания и выполнять дополнительные действия.
Пример использования события onEnd для обновления
порядка строк в базе данных:
sortable.option("onEnd", function(evt) {
const order = Array.from(tableBody.querySelectorAll('tr'))
.map(row => row.dataset.id);
fetch('/update-order', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({order})
});
});
SortableJS поддерживает группы, что позволяет перемещать строки между разными таблицами:
const table1 = document.querySelector('#table1 tbody');
const table2 = document.querySelector('#table2 tbody');
Sortable.create(table1, { group: 'shared', animation: 150 });
Sortable.create(table2, { group: 'shared', animation: 150 });
Использование одного имени группы (group: 'shared')
позволяет свободно перемещать строки между таблицами с сохранением
анимации.
Можно запретить перемещение определённых строк, например, фиксированных заголовков или итоговых строк:
const sortable = new Sortable(tableBody, {
handle: '.drag-handle',
filter: '.no-drag',
onMove(evt) {
return !evt.related.classList.contains('no-drag');
}
});
Для улучшения визуального восприятия рекомендуется использовать
классы ghostClass и chosenClass. Пример
CSS:
.sortable-ghost {
opacity: 0.4;
}
.sortable-chosen {
background-color: #f0f0f0;
border: 1px dashed #999;
}
Дополнительно можно применить эффекты перехода для плавного перемещения строк:
tbody tr {
transition: transform 0.15s ease;
}
SortableJS корректно работает с динамически добавленными элементами.
Достаточно повторно инициализировать экземпляр или использовать метод
Sortable.utils, чтобы обновить список:
sortable.addEventListener('onAdd', function(evt) {
// Логика для добавленного элемента
});
Для удаления строки достаточно удалить элемент из DOM, а библиотека автоматически скорректирует порядок оставшихся элементов.
SortableJS легко интегрируется с популярными фреймворками, такими как
React, Vue и Angular, через официальные обёртки или нативные методы. Для
React существует компонент react-sortablejs, который
поддерживает работу с состоянием и ререндерингом таблиц без потери
функциональности drag-and-drop.
SortableJS обеспечивает гибкую и высокопроизводительную работу с таблицами, предоставляя контроль над визуальными эффектами, событиями и взаимодействием между элементами. Благодаря этому библиотека идеально подходит для реализации сложных интерфейсов с возможностью интерактивной сортировки данных.