Gridstack.js предоставляет возможность создавать динамические, перетаскиваемые и масштабируемые сетки. Одной из ключевых особенностей является поддержка вложенных сеток, когда внутри одного элемента сетки можно разместить другую сетку с независимыми ячейками. Это позволяет строить сложные интерфейсы с многоуровневой организацией блоков.
Вложенные сетки создаются путем инициализации Gridstack внутри элемента, который уже является частью родительской сетки. Основное правило — контейнер вложенной сетки должен быть внутри блока родительской сетки, иначе управление положением и размерами будет некорректным.
// Инициализация родительской сетки
const parentGrid = GridStack.init({
column: 12,
margin: 10
}, '#parent-grid');
// Добавление элемента с вложенной сеткой
parentGrid.addWidget(`
<div class="grid-stack-item">
<div class="grid-stack-item-content">
<div class="nested-grid"></div>
</div>
</div>
`);
// Инициализация вложенной сетки
const nestedGrid = GridStack.init({
column: 6,
margin: 5,
staticGrid: false
}, '.nested-grid');
Ключевые моменты:
nestedGrid работает независимо от
parentGrid, но размеры родительского блока влияют на
видимую область.column и margin для вложенной
сетки может отличаться от родительской.staticGrid управляет возможностью
перетаскивания внутри вложенной сетки.Элементы вложенной сетки добавляются точно так же, как в обычной сетке:
nestedGrid.addWidget(`
<div class="grid-stack-item" gs-w="3" gs-h="2">
<div class="grid-stack-item-content">Вложенный блок 1</div>
</div>
`);
nestedGrid.addWidget(`
<div class="grid-stack-item" gs-w="3" gs-h="2">
<div class="grid-stack-item-content">Вложенный блок 2</div>
</div>
`);
Параметры gs-w и gs-h определяют
ширину и высоту блока в единицах колонок и строк.
Для динамического изменения положения и размера используется API:
const item = nestedGrid.getGridItems()[0];
nestedGrid.update(item, {x: 1, y: 0, w: 4, h: 2});
Перетаскивание элементов
dragIn.Изменение размеров
change или resizestop:nestedGrid.on('change', function(event, items) {
items.forEach(item => {
console.log(`Элемент ${item.el.textContent} изменён`);
});
});
События и колбэки
added, removed, change,
dragstart, dragstop.Для сложных интерфейсов удобно использовать фиксированные шаблоны вложенных сеток:
const nestedTemplate = `
<div class="grid-stack-item">
<div class="grid-stack-item-content">
<div class="nested-grid">
<div class="grid-stack-item" gs-w="2" gs-h="1">
<div class="grid-stack-item-content">Блок A</div>
</div>
<div class="grid-stack-item" gs-w="2" gs-h="1">
<div class="grid-stack-item-content">Блок B</div>
</div>
</div>
</div>
</div>
`;
parentGrid.addWidget(nestedTemplate);
GridStack.init({column: 4, margin: 5}, '.nested-grid');
Такой подход позволяет создавать повторяемые модули, которые легко масштабировать и изменять.
staticGrid: true для вложенных сеток,
если элементы не должны двигаться, значительно улучшает
производительность.float: false и
использовать minW/minH для контроля
размеров.CSS для вложенных сеток требует учета размера контейнера:
.nested-grid {
background: #f0f0f0;
padding: 5px;
min-height: 100px;
}
.grid-stack-item-content {
background: #d0d0ff;
border: 1px solid #999;
display: flex;
align-items: center;
justify-content: center;
}
Особенности визуального представления:
padding и margin предотвращает
пересечение элементов и делает интерфейс более читабельным.Вложенные сетки в Gridstack.js позволяют создавать сложные, модульные интерфейсы, где каждый уровень сетки управляется независимо, но при этом сохраняется логическая и визуальная структура страницы.