Gridstack.js — это мощная библиотека для создания интерактивных, перетаскиваемых и ресайзабельных сеток в браузере. Она позволяет строить гибкие рабочие пространства с виджетами, которые можно свободно перемещать и изменять по размеру. В основе работы лежит концепция грид-системы, где элементы привязаны к ячейкам сетки, что обеспечивает аккуратное размещение и автоматическое управление позициями.
Создание сетки начинается с подключения библиотек Gridstack.js и необходимых стилей. После этого сетка инициализируется через Jav * aScript:
const grid = GridStack.init({
column: 12, // количество колонок в сетке
float: true, // позволяет элементам "плыть" при перемещении
animate: true // анимация при перетаскивании и ресайзе
});
Каждый виджет представлен HTML-элементом с атрибутами
data-gs-* для управления размером и позицией:
<div class="grid-stack">
<div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="4" data-gs-height="2">
<div class="grid-stack-item-content">Виджет 1</div>
</div>
</div>
Добавление динамических виджетов через Jav * aScript:
grid.addWidget(
'<div class="grid-stack-item" data-gs-x="4" data-gs-y="0" data-gs-width="4" data-gs-height="2">' +
'<div class="grid-stack-item-content">Виджет 2</div>' +
'</div>'
);
Gridstack.js предоставляет гибкие методы для контроля поведения виджетов:
grid.enableMove(false); // запретить перемещение всех виджетов
grid.enableResize(true); // разрешить изменение размеров
grid.on('change', function(event, items) {
items.forEach(item => {
console.log(`Виджет ${item.el.id} перемещён в x:${item.x}, y:${item.y}`);
});
});
Gridstack.js поддерживает responsive layouts через определение точек останова:
grid.setColumn(8, 600); // 8 колонок при ширине экрана до 600px
grid.setColumn(12, 1200); // 12 колонок при ширине экрана более 1200px
Использование responsive options позволяет создавать виджеты, которые автоматически перестраиваются под разные размеры экранов.
Для сохранения пользовательских настроек сетки применяется метод
save() и восстановление через load():
// Сохранение состояния
const layout = grid.save();
localStorage.setItem('grid-layout', JSON.stringify(layout));
// Восстановление состояния
const savedLayout = JSON.parse(localStorage.getItem('grid-layout'));
grid.load(savedLayout);
Это позволяет пользователю восстанавливать своё рабочее пространство после перезагрузки страницы или смены устройства.
Gridstack.js поддерживает вложенные грида, что особенно полезно для построения модульных интерфейсов:
<div class="grid-stack">
<div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="6" data-gs-height="4">
<div class="grid-stack-item-content">
<div class="grid-stack nested-grid">
<div class="grid-stack-item" data-gs-x="0" data-gs-y="0" data-gs-width="3" data-gs-height="2">
<div class="grid-stack-item-content">Вложенный виджет</div>
</div>
</div>
</div>
</div>
</div>
Вложенные сетки наследуют все возможности Gridstack.js, включая перетаскивание, изменение размеров и адаптивность, что позволяет строить многоуровневые интерфейсы.
Каждый виджет можно стилизовать через CSS. Gridstack.js предоставляет
классы .grid-stack-item и
.grid-stack-item-content. Дополнительно можно использовать
псевдоклассы для выделения активного элемента при перетаскивании:
.grid-stack-item-content {
background: #f0f0f0;
border: 1px solid #ccc;
border-radius: 6px;
padding: 10px;
box-sizing: border-box;
}
.grid-stack-item.ui-draggable-dragging {
box-shadow: 0 4px 12px rgba(0,0,0,0.2);
}
Gridstack.js легко интегрируется с Vue, React и Angular, используя соответствующие обертки или через прямой доступ к DOM. Это позволяет создавать интерактивные дашборды с динамическим обновлением данных и синхронизацией состояния.
removeWidget(el) — удаляет виджет.update(el, options) — обновляет свойства виджета,
например, размер или позицию.batchUpdate() / commit() — группировка
нескольких изменений для оптимизации производительности.getGridItems() — получение текущих виджетов и их
состояния.Эти инструменты делают Gridstack.js универсальным решением для построения настраиваемых рабочих пространств, интерактивных дашбордов и модульных интерфейсов, где элементы можно свободно перемещать, изменять их размеры и сохранять пользовательские настройки.