В библиотеке Muuri процесс перетаскивания элементов
основан на модуле drag, который интегрирован в основной
функционал сетки. Для того чтобы элемент стал перетаскиваемым,
необходимо включить соответствующую опцию при инициализации сетки:
const grid = new Muuri('.grid', {
dragEnabled: true,
dragSort: true, // позволяет менять порядок элементов
dragContainer: document.body // контейнер для перетаскиваемого элемента
});
Эти опции задают базовое поведение и служат отправной точкой для более детальной кастомизации.
Muuri предоставляет детальную систему событий для перетаскивания. Основные события, связанные с инициацией перетаскивания, это:
dragStart – возникает в момент начала перетаскивания
элемента.dragMove – срабатывает при перемещении элемента.dragReleaseStart – срабатывает при отпускании элемента
для завершения перетаскивания.Пример использования события dragStart:
grid.on('dragStart', function(item) {
item.getElement().style.transition = 'none'; // отключение анимации на время перетаскивания
console.log('Перетаскивание начато для элемента:', item.getElement());
});
Ключевые моменты:
dragStart передаёт объект
item, который содержит все данные о перетаскиваемом
элементе.Muuri позволяет ограничивать начало перетаскивания определёнными условиями. Основная опция для этого – dragStartPredicate, которая задаёт функцию проверки:
const grid = new Muuri('.grid', {
dragEnabled: true,
dragStartPredicate: function(item, event) {
// разрешаем перетаскивание только при клике на заголовок элемента
return event.target.classList.contains('item-header');
}
});
mousedown или touchstart).true или false
определяет, разрешено ли начало перетаскивания.Это позволяет создавать гибкую логику, например:
Для улучшения UX важно корректно обработать визуальное состояние элемента на старте. Основные приёмы:
Пример:
grid.on('dragStart', function(item) {
const el = item.getElement();
el.style.transition = 'none';
el.style.zIndex = 1000;
el.classList.add('dragging');
});
После завершения перетаскивания следует вернуть исходные стили:
grid.on('dragReleaseEnd', function(item) {
const el = item.getElement();
el.style.transition = '';
el.style.zIndex = '';
el.classList.remove('dragging');
});
Muuri позволяет управлять началом перетаскивания через координаты и рамки:
dragAxis – ограничивает движение по оси x
или y.dragSortInterval – минимальное расстояние перемещения
до перестановки элементов.dragReleaseDuration – время анимации возвращения
элемента на место при отмене перетаскивания.Пример ограничения по вертикали:
const grid = new Muuri('.grid', {
dragEnabled: true,
dragAxis: 'y' // движение только по вертикали
});
Это особенно полезно для списков, таблиц или сеток, где горизонтальное перемещение нежелательно.
Эта последовательность обеспечивает гибкий контроль за процессом начала перетаскивания и визуальное согласование с интерфейсом, позволяя создавать динамичные и отзывчивые сетки на Muuri.