Gridstack.js предоставляет возможность динамического создания и управления сеткой виджетов (widgets) с поддержкой перетаскивания и изменения размеров. Для создания сетки используется конструктор:
const grid = GridStack.init({
column: 12,
cellHeight: 80,
verticalMargin: 10,
disableOneColumnMode: false,
float: false
});
Ключевые параметры:
column — количество колонок сетки.cellHeight — высота ячейки сетки в пикселях.verticalMargin — вертикальный отступ между
элементами.disableOneColumnMode — отключение автоматического
перехода в режим одной колонки при малых ширинах экрана.float — позволяет элементам свободно «плавать» при
перемещении.Gridstack.js поддерживает динамическое управление элементами. Для
добавления виджета используется метод addWidget:
grid.addWidget('<div class="grid-stack-item" gs-x="0" gs-y="0" gs-width="4" gs-height="2"><div class="grid-stack-item-content">Контент</div></div>');
Особенности:
gs-x и gs-y — координаты в сетке.gs-width и gs-height — размеры виджета в
ячейках.addWidget возвращает объект виджета для дальнейшей
работы.Удаление виджета осуществляется методом
removeWidget:
const widget = document.querySelector('.grid-stack-item');
grid.removeWidget(widget, true);
Параметр true позволяет удалить виджет из DOM
полностью.
Gridstack.js предоставляет API для управления возможностью перемещения и изменения размеров:
grid.enableMove(document.querySelector('.grid-stack-item'));
grid.disableMove(document.querySelector('.grid-stack-item'));
grid.enableResize(document.querySelector('.grid-stack-item'));
grid.disableResize(document.querySelector('.grid-stack-item'));
Важно: Эти методы работают как для отдельного
виджета, так и для всей сетки через передачу null вместо
конкретного элемента.
Состояние сетки хранит информацию о положении и размере всех элементов. Для получения текущего состояния используется:
const serialized = grid.save();
console.log(serialized);
Метод save() возвращает массив объектов:
[
{x:0, y:0, width:4, height:2, id:"widget1"},
{x:4, y:0, width:4, height:2, id:"widget2"}
]
Для восстановления состояния:
grid.load(serialized);
load() очищает текущие виджеты и размещает элементы
согласно сохранённым координатам и размерам.
Gridstack.js позволяет изменять параметры виджетов напрямую:
const widget = document.querySelector('.grid-stack-item');
grid.update(widget, {x:1, y:2, width:6, height:3});
Метод update поддерживает:
x, y — новые координаты.width, height — новые размеры.autoPosition — автоматическое позиционирование при
конфликте с другими виджетами.Для перемещения виджета без изменения размера используется метод
move:
grid.move(widget, 2, 3);
Количество колонок в сетке можно изменять динамически:
grid.column(8); // сетка теперь 8 колонок
При изменении количества колонок Gridstack.js автоматически
перераспределяет виджеты, сохраняя их относительные позиции. Для
управления адаптивностью используется опция
oneColumnMode:
grid.on('change', function(event, items) {
console.log('Элементы изменены:', items);
});
Эта конструкция позволяет отслеживать перемещение и изменение размеров всех виджетов.
Gridstack.js предоставляет мощное событие API для управления действиями пользователя:
added — когда виджет добавлен.removed — когда виджет удалён.change — при изменении позиции или размеров.dragstart / dragstop — начало и окончание
перетаскивания.resizestart / resizestop — начало и
окончание изменения размеров.Пример подписки:
grid.on('added', function(event, items) {
console.log('Добавлены виджеты:', items);
});
Методы batchUpdate и commit позволяют
оптимизировать изменения множества виджетов:
grid.batchUpdate();
grid.update(widget1, {x:1, y:1});
grid.update(widget2, {x:5, y:0});
grid.commit();
batchUpdate() приостанавливает обновление DOM и
перерасчет сетки, что особенно полезно при массовых изменениях.
Методы compact() и removeEmpty() позволяют
управлять плотностью сетки:
grid.compact(); // уплотняет сетку, сдвигая виджеты вверх
grid.removeEmpty(); // удаляет пустые строки и столбцы
compact() автоматически устраняет пустое пространство
между виджетами, сохраняя их порядок.
Gridstack.js поддерживает управление z-index и видимостью виджетов:
grid.getWidgetElements().forEach(widget => {
widget.style.display = 'none'; // скрыть виджет
});
Для восстановления отображения:
widget.style.display = '';
getWidgetElements() возвращает массив всех DOM-элементов
сетки, что удобно для массового управления.
Gridstack.js позволяет связывать виджеты с объектами данных.
Используя data-gs-id можно сохранять уникальные
идентификаторы:
<div class="grid-stack-item" data-gs-id="widget1"></div>
При сериализации:
const state = grid.save(false, true); // вторым аргументом сохраняются data-атрибуты
Это позволяет строить сложные динамические интерфейсы с сохранением состояния на сервере и последующей загрузкой.
Для больших сеток рекомендуется:
batchUpdate() при множественных
изменениях.disableOneColumnMode для предотвращения
лишних перерасчетов на мобильных устройствах.Методы управления сеткой в Gridstack.js создают гибкий инструмент для динамических дашбордов, панелей администрирования и интерактивных интерфейсов с перетаскиваемыми виджетами.