Gridstack.js предоставляет гибкий API для создания интерактивных, перетаскиваемых и ресайзабельных сеток. Помимо стандартного drag-and-drop интерфейса и конфигурации через HTML-атрибуты, библиотека поддерживает ряд альтернативных методов взаимодействия, которые позволяют управлять элементами сетки программно, интегрировать кастомные события и расширять функциональность под специфические задачи.
Вместо статической разметки можно динамически создавать виджеты с помощью методов API.
Добавление виджета:
const grid = GridStack.init({/* опции */});
grid.addWidget({
x: 0,
y: 0,
w: 4,
h: 2,
content: '<div class="grid-stack-item-content">Новый виджет</div>'
});
Ключевые моменты:
x, y — координаты ячейки сетки.w, h — ширина и высота в ячейках.content — HTML-контент, который будет помещён в
элемент.Удаление виджета:
const el = document.querySelector('.grid-stack-item');
grid.removeWidget(el);
Программное удаление удобно при событиях, зависящих от данных или состояния приложения, например, при закрытии виджета по кнопке в его контенте.
Gridstack.js позволяет изменять положение и размеры элементов программно без прямого взаимодействия с пользователем.
const widget = document.querySelector('.grid-stack-item');
grid.update(widget, {x: 2, y: 1, w: 6, h: 3});
Метод update принимает объект с новыми параметрами:
x, y — новые координаты.w, h — новые размеры.autoPosition и
noMove для ограничения поведения.Gridstack.js генерирует набор событий, которые можно использовать для кастомной логики. Основные события:
added — вызывается после добавления виджета в
сетку.removed — после удаления элемента.change — при изменении размера или позиции любого
виджета.dragstart и dragstop — начало и завершение
перетаскивания.resizestart и resizestop — начало и
завершение изменения размера.Пример привязки события:
grid.on('change', function(event, items) {
items.forEach(item => {
console.log(`Виджет ${item.id} перемещён в (${item.x}, ${item.y})`);
});
});
Особенность: события позволяют полностью синхронизировать состояние сетки с сервером или локальными данными.
Gridstack.js предоставляет возможность управлять виджетами через внешние интерфейсы, такие как кнопки или ползунки.
Изменение размера через кнопки:
document.getElementById('expand-btn').addEventListener('click', () => {
const widget = document.querySelector('.grid-stack-item');
grid.update(widget, {w: widget.offsetWidth / grid.cellWidth + 1});
});
Перемещение виджета через стрелки:
document.addEventListener('keydown', (e) => {
const widget = document.querySelector('.grid-stack-item');
let {x, y} = widget.gridstackNode;
if (e.key === 'ArrowRight') x += 1;
if (e.key === 'ArrowLeft') x -= 1;
if (e.key === 'ArrowDown') y += 1;
if (e.key === 'ArrowUp') y -= 1;
grid.update(widget, {x, y});
});
Такой подход позволяет реализовать управление виджетами без использования мыши, что критично для приложений с доступностью или альтернативными интерфейсами.
Gridstack.js поддерживает режим редактирования и режим просмотра, которые можно менять динамически.
// Включение/выключение редактирования
grid.enableMove(false); // блокировка перемещения
grid.enableResize(true); // разрешение изменения размеров
Также можно полностью переключать состояние drag-and-drop:
grid.setStatic(true); // все виджеты становятся статичными
grid.setStatic(false); // возвращение интерактивности
Эти методы удобны для реализации интерфейсов с режимами «редактирование/просмотр» без пересоздания сетки.
Gridstack.js легко интегрируется с внешними библиотеками:
Пример с React:
<GridStack
onCha nge={(items) => console.log('Состояние обновлено', items)}
options={{float: true}}
>
<div className="grid-stack-item">Контент</div>
</GridStack>
Это позволяет полностью управлять виджетами не через drag-and-drop, а через реактивное состояние компонентов.
Gridstack.js хранит информацию о положении и размере виджетов, что упрощает сохранение состояния приложения:
const serialized = grid.save();
localStorage.setItem('grid-state', JSON.stringify(serialized));
// Восстановление состояния
const saved = JSON.parse(localStorage.getItem('grid-state'));
grid.load(saved);
Ключевой момент: использование save() и
load() позволяет полностью синхронизировать интерфейс с
хранилищем данных, обеспечивая быстрый откат к предыдущему состоянию или
загрузку настроенной конфигурации для пользователя.
Gridstack.js допускает полное управление сеткой через JavaScript без
необходимости прописывать data-gs-* атрибуты. Это важно для
динамически генерируемых интерфейсов:
const grid = GridStack.init({
column: 12,
float: true,
margin: 10,
disableOneColumnMode: false
});
grid.addWidget({
x: 0, y: 0, w: 3, h: 2, content: '<div>Динамический виджет</div>'
});
Это позволяет создавать адаптивные интерфейсы, где структура сетки формируется на лету на основе данных приложения.
Эти альтернативные методы взаимодействия с Gridstack.js обеспечивают полное управление сеткой как с точки зрения интерфейса пользователя, так и программно. Применение событий, API управления и интеграция с сторонними библиотеками делает библиотеку универсальным инструментом для сложных дашбордов, интерфейсов управления и интерактивных приложений.