Библиотека Shopify Draggable предоставляет гибкий инструмент для реализации перетаскивания элементов в веб-интерфейсах. Работа с сетками и таблицами — одна из ключевых областей применения, позволяющая создавать интерактивные таблицы, доски задач или галереи с возможностью динамического изменения порядка элементов.
Для работы с таблицей необходимо инициализировать Draggable на
контейнере, который содержит строки <tr> или ячейки
<td>:
import {Sortable} from '@shopify/draggable';
const tableSortable = new Sortable(document.querySelectorAll('table tbody'), {
draggable: 'tr',
mirror: {
constrainDimensions: true,
},
});
Ключевые параметры:
draggable — CSS-селектор элементов, которые будут
перетаскиваться. Для таблицы обычно это строки
<tr>.mirror.constrainDimensions — обеспечивает сохранение
ширины и высоты элемента при перетаскивании, что важно для табличной
структуры.Draggable предоставляет набор событий, которые позволяют отслеживать и изменять поведение при работе с сетками:
drag:start — вызывается при начале
перетаскивания строки.drag:move — вызывается при движении
строки.drag:stop — вызывается при завершении
перетаскивания.sortable:sorted — событие, которое
срабатывает после изменения порядка элементов.sortable:stop — событие, которое
вызывается после окончательного размещения элемента в новом месте.Пример отслеживания события сортировки:
tableSortable.on('sortable:sorted', (event) => {
const movedRow = event.data.dragEvent.source;
console.log('Перемещённая строка:', movedRow);
});
Draggable позволяет не только перетаскивать строки, но и отдельные
ячейки. Для этого используют SwapAnimation и
Sortable вместе:
import {Sortable, SwapAnimation} from '@shopify/draggable';
const cellSortable = new Sortable(document.querySelectorAll('table tbody'), {
draggable: 'td',
plugins: [SwapAnimation],
});
Особенности:
SwapAnimation создаёт плавную анимацию обмена
позиций, что улучшает UX при перемещении элементов внутри сетки.Draggable поддерживает гибкие ограничения:
containers.const sortable = new Sortable(document.querySelectorAll('.grid-container'), {
draggable: '.grid-item',
containers: [document.querySelector('.grid-container')],
});
axis
позволяет зафиксировать перемещение по вертикали или горизонтали, что
полезно для таблиц:const verticalSortable = new Sortable(document.querySelectorAll('table tbody'), {
draggable: 'tr',
axis: 'y',
});
Для сеток Draggable позволяет перетаскивать элементы и автоматически обновлять их позиции:
const gridSortable = new Sortable(document.querySelectorAll('.grid'), {
draggable: '.grid-item',
mirror: {
appendTo: 'body',
},
});
Советы при работе с сетками:
mirror.appendTo: 'body' для корректного
отображения перетаскиваемого элемента поверх других.mirror.constrainDimensions, чтобы элемент не менял размер
при перемещении.После изменения порядка элементов таблицы или сетки часто требуется
синхронизировать порядок с сервером. В событии
sortable:stop можно собирать актуальный порядок и
отправлять его:
tableSortable.on('sortable:stop', () => {
const rows = Array.from(document.querySelectorAll('table tbody tr'));
const order = rows.map(row => row.dataset.id);
fetch('/update-order', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({order}),
});
});
При работе с большими таблицами или сетками следует учитывать:
mirror.constrainDimensions
и SwapAnimation только при необходимости, чтобы не
перегружать браузер.SwapAnimation — плавная анимация
перемещения.ResizeMirror — синхронизация размеров
перетаскиваемого элемента с оригиналом.Plugins для мультиселекции — позволяют
перемещать несколько элементов одновременно.<table> и CSS Grid.Эта гибкость делает Shopify Draggable мощным инструментом для создания интерактивных таблиц и сеток с современным UX.