Gridstack.js предоставляет гибкий механизм работы с виджетами в
сетке. Виджет в Gridstack — это элемент DOM, обычно
<div>, который может быть перемещаемым, изменяемым по
размеру и динамически управляемым через API библиотеки. Каждый виджет
характеризуется набором атрибутов: x, y,
width, height, а также параметрами поведения,
такими как locked, resizable и
autoPosition.
<div class="grid-stack">
<div class="grid-stack-item" gs-w="4" gs-h="2" gs-x="0" gs-y="0">
<div class="grid-stack-item-content">Виджет 1</div>
</div>
<div class="grid-stack-item" gs-w="2" gs-h="2" gs-x="4" gs-y="0">
<div class="grid-stack-item-content">Виджет 2</div>
</div>
</div>
gs-w, gs-h — ширина и высота виджета в
ячейках сетки.gs-x, gs-y — координаты верхнего левого
угла виджета.Инициализация сетки осуществляется через конструктор
GridStack.init:
const grid = GridStack.init({
cellHeight: 100,
float: true,
animate: true
});
cellHeight — фиксированная высота ячеек.float — разрешает перекрытие виджетов во время
перемещения.animate — включает анимацию при перемещении и изменении
размера.Динамическое добавление виджетов выполняется через
метод addWidget:
grid.addWidget(
`<div class="grid-stack-item" gs-w="3" gs-h="2">
<div class="grid-stack-item-content">Новый виджет</div>
</div>`,
{ x: 0, y: 2 }
);
Удаление виджета:
const widget = document.querySelector('.grid-stack-item');
grid.removeWidget(widget);
addWidget принимает как HTML-код виджета, так и
объект с настройками (x, y,
width, height).removeWidget полностью удаляет виджет из сетки и
DOM.Gridstack.js позволяет управлять положением виджета программно:
const item = grid.getCellFromPixel({ left: 50, top: 100 });
grid.update(item.el, { x: 2, y: 1, w: 4, h: 2 });
update изменяет размеры и координаты виджета без
необходимости пересоздавать элемент.getCellFromPixel возвращает объект виджета,
находящегося в указанных координатах пикселей.Для блокировки перемещения и изменения размера используется свойство
locked:
grid.update(widget, { locked: true });
Gridstack.js поддерживает широкий набор событий, связанных с виджетами:
added — срабатывает при добавлении нового виджета.removed — срабатывает при удалении виджета.change — вызывается при изменении размеров или
позиции.dragstart / dragstop — при начале и
окончании перетаскивания.resizestart / resizestop — при начале и
окончании изменения размера.Пример использования события change:
grid.on('change', function(event, items) {
items.forEach(item => {
console.log(`Виджет ${item.el.innerText} перемещён в (${item.x}, ${item.y})`);
});
});
Перетаскивание и ресайзинг можно включать или отключать для отдельных виджетов:
grid.makeWidget(widget); // Делает элемент виджетом Gridstack
grid.resizable(widget, false); // Отключает изменение размера
grid.draggable(widget, { handle: '.drag-handle' }); // Включает перетаскивание только по указанной области
makeWidget — инициализация DOM-элемента как виджета
сетки.draggable и resizable принимают опции для
тонкой настройки поведения.Состояние сетки можно получить через метод save:
const serializedData = grid.save();
console.log(serializedData);
save возвращает массив объектов с параметрами всех
виджетов (x, y, w,
h, id и пользовательские атрибуты).Для восстановления состояния используется load:
grid.removeAll(); // Очистка сетки
grid.load(serializedData); // Восстановление предыдущего состояния
Gridstack.js позволяет управлять z-index виджетов и
их перекрытием. Для этого используются методы move и
события drag:
grid.on('dragstart', function(event, el) {
el.style.zIndex = 100; // Поднимаем виджет над остальными
});
grid.on('dragstop', function(event, el) {
el.style.zIndex = '';
});
Помимо работы с отдельными виджетами, Gridstack.js предоставляет методы для массового управления:
removeAll — удаление всех виджетов.batchUpdate — временное отключение перерасчета сетки
для групповых изменений:grid.batchUpdate();
grid.update(widget1, { x: 0, y: 0 });
grid.update(widget2, { x: 4, y: 0 });
grid.commit(); // Применяет все изменения одновременно
commit применяет все изменения после
batchUpdate, предотвращая лишние пересчёты и повышая
производительность.Gridstack.js поддерживает nested grids — сетки внутри виджетов, позволяя создавать сложные макеты с иерархической структурой. Управление такими виджетами аналогично базовой сетке, но требует отдельной инициализации вложенной сетки внутри элемента:
const nestedGrid = GridStack.init({ cellHeight: 50 }, widget.querySelector('.grid-stack'));
addWidget, removeWidget, update)
и позволяют строить гибкие интерфейсы с множеством уровней
виджетов.Эта система управления виджетами в Gridstack.js обеспечивает максимальную гибкость: добавление, удаление, динамическое изменение размеров, события и сохранение состояния, а также возможность создавать сложные интерфейсы с вложенной структурой. Такой подход упрощает разработку дашбордов, конструкторов интерфейсов и адаптивных панелей управления.