Gridstack.js предоставляет мощный инструмент для создания интерактивных, адаптивных сеток с возможностью перетаскивания элементов. Одной из продвинутых возможностей является перемещение виджетов между различными сетками на одной странице, что особенно полезно для дашбордов с несколькими секциями или рабочими областями.
Для начала необходимо создать несколько контейнеров сеток в HTML и инициализировать их через Gridstack:
<div class="grid grid-1"></div>
<div class="grid grid-2"></div>
const grid1 = GridStack.init({
column: 12,
float: true,
acceptWidgets: true
}, '.grid-1');
const grid2 = GridStack.init({
column: 12,
float: true,
acceptWidgets: true
}, '.grid-2');
Ключевые моменты:
acceptWidgets: true — разрешает сетке принимать
элементы, перемещаемые из других сеток.float: true — позволяет элементам “плавать” при
перемещении, чтобы избежать конфликта координат.Чтобы виджеты могли свободно перемещаться между сетками, необходимо
подключить drag-and-drop функциональность Gridstack.
Для этого используется dragIn и dragOut
события, а также метод makeWidget:
// Подготовка виджетов для переноса
grid1.enableMove(true);
grid2.enableMove(true);
// Обработчик события добавления виджета в другую сетку
grid2.on('added', function(event, items) {
console.log('В grid2 добавлен виджет:', items);
});
enableMove(true) активирует
возможность перемещения виджетов.added позволяет отслеживать, когда виджет был
успешно добавлен в новую сетку.В Gridstack виджеты можно добавлять динамически через Jav * aScript:
grid1.addWidget({
x: 0,
y: 0,
w: 3,
h: 2,
content: '<div class="grid-stack-item-content">Виджет 1</div>'
});
grid2.addWidget({
x: 0,
y: 0,
w: 4,
h: 2,
content: '<div class="grid-stack-item-content">Виджет 2</div>'
});
x, y и
размеры w, h.content позволяет вставлять произвольный
HTML внутрь виджета.Gridstack.js базируется на jQuery UI draggable/droppable, что позволяет перемещать виджеты между контейнерами:
$('.grid-stack').on('dragstart', '.grid-stack-item', function(event, ui) {
$(this).data('originGrid', $(this).closest('.grid-stack'));
});
$('.grid-stack').on('drop', function(event, ui) {
const originGrid = ui.helper.data('originGrid')[0].gridstack;
const targetGrid = $(this)[0].gridstack;
const widget = ui.helper[0].gridstackNode;
originGrid.removeWidget(ui.helper);
targetGrid.addWidget(ui.helper, {autoPosition: true});
});
Пояснения:
data('originGrid') хранит ссылку на исходную
сетку.drop виджет удаляется из исходной сетки и
добавляется в целевую.autoPosition: true позволяет Gridstack автоматически
размещать виджет в первой свободной ячейке.Для сохранения текущего расположения виджетов рекомендуется
использовать метод save() и load():
// Сохранение состояния сетки
const grid1State = grid1.save();
const grid2State = grid2.save();
// Восстановление состояния
grid1.load(grid1State);
grid2.load(grid2State);
Это важно при перемещении виджетов между сетками, чтобы координаты и размеры корректно обновлялись и не создавали конфликтов.
autoPosition или адаптировать
размеры при переносе.added,
removed, change — важны для отслеживания
перемещений.makeWidget для правильной активации drag-and-drop.grid1.on('change', function(event, items) {
items.forEach(function(node) {
if(node.y > 10) { // условие переноса
grid1.removeWidget(node.el);
grid2.addWidget(node.el);
}
});
});
change и методов
removeWidget/addWidget обеспечивает плавное
перемещение без потери состояния.Эти техники позволяют создавать динамичные дашборды, где элементы могут свободно перемещаться между разными областями интерфейса, сохраняя адаптивность и управляемость. Gridstack.js сочетает простоту API с гибкостью drag-and-drop, что делает работу с несколькими сетками интуитивной и предсказуемой.