Gridstack.js предоставляет мощный механизм для динамического создания и управления сеткой элементов. Добавление новых виджетов в сетку может выполняться как статически в HTML, так и динамически через JavaScript, что особенно удобно для интерактивных интерфейсов и редакторов панелей.
В основе лежит метод addWidget, который позволяет
создать новый элемент сетки с заданными параметрами
позиции, размера и
содержимого. Синтаксис метода:
grid.addWidget(el, x, y, width, height, autoPosition, minWidth, maxWidth, minHeight, maxHeight);
true, виджет будет автоматически размещен в первой
доступной позиции.Пример динамического добавления элемента:
var grid = GridStack.init({
column: 12,
float: true
});
grid.addWidget('<div class="grid-stack-item"><div class="grid-stack-item-content">Новый виджет</div></div>',
{x: 0, y: 0, width: 3, height: 2});
В этом примере создаётся виджет размером 3x2 ячейки в верхнем левом
углу сетки. Использование объекта с ключами x,
y, width, height предпочтительнее
для читаемости и расширяемости.
Gridstack.js поддерживает создание элементов программно с
возможностью полной кастомизации. Для этого удобно использовать метод
addWidget с объектом параметров:
grid.addWidget({
x: 1,
y: 2,
width: 4,
height: 3,
content: '<div class="grid-stack-item-content">Контент</div>',
autoPosition: false
});
Здесь content позволяет сразу вставить HTML внутрь
элемента сетки. Такой подход особенно полезен при интеграции с API или
при динамическом построении панелей на основе данных.
При добавлении новых элементов важно учитывать ограничения размеров и поведение при перетаскивании:
grid.addWidget({
x: 0,
y: 0,
width: 2,
height: 2,
minWidth: 1,
maxWidth: 4,
minHeight: 1,
maxHeight: 3,
content: '<div class="grid-stack-item-content">Ограниченный виджет</div>'
});
locked и
autoPosition для более гибкого поведения.Для сложных интерфейсов удобно заранее создавать шаблоны виджетов и затем клонировать их при необходимости. Пример:
var template = document.createElement('div');
template.classList.add('grid-stack-item');
template.innerHTML = '<div class="grid-stack-item-content">Шаблонный виджет</div>';
grid.addWidget(template.cloneNode(true), {x: 2, y: 0, width: 3, height: 2});
grid.addWidget(template.cloneNode(true), {x: 5, y: 0, width: 3, height: 2});
Такой подход упрощает управление стилями и поддерживает единый дизайн для всех элементов сетки.
Виджеты Gridstack.js могут включать интерактивные элементы. При добавлении нового виджета можно сразу привязать обработчики событий:
var widget = document.createElement('div');
widget.classList.add('grid-stack-item');
widget.innerHTML = '<div class="grid-stack-item-content">Кликабельный виджет</div>';
widget.addEventListener('click', function() {
alert('Виджет был нажат!');
});
grid.addWidget(widget, {x: 0, y: 1, width: 2, height: 2});
Это позволяет создавать динамичные панели с реактивным поведением без дополнительной модификации DOM после добавления.
Если не требуется жёсткая привязка к координатам, можно использовать автопозиционирование. Gridstack.js сам найдёт свободное место для нового элемента:
grid.addWidget('<div class="grid-stack-item"><div class="grid-stack-item-content">Авто-позиция</div></div>',
{autoPosition: true, width: 2, height: 2});
Это особенно полезно при динамическом добавлении множества элементов в сетку, где точное позиционирование заранее неизвестно.
Gridstack.js поддерживает загрузку сетки из массива объектов, что позволяет создавать интерфейс на основе данных. Формат:
var widgets = [
{x:0, y:0, width:2, height:2, content:'Виджет 1'},
{x:2, y:0, width:3, height:2, content:'Виджет 2'},
{x:0, y:2, width:4, height:1, content:'Виджет 3'}
];
widgets.forEach(function(w) {
grid.addWidget({
x: w.x,
y: w.y,
width: w.width,
height: w.height,
content: '<div class="grid-stack-item-content">' + w.content + '</div>'
});
});
Такой способ позволяет интегрировать Gridstack.js с серверными данными, JSON API или локальным хранилищем состояния.
При массовом добавлении виджетов важно учитывать:
Эти приёмы позволяют поддерживать высокую производительность даже при работе с десятками и сотнями элементов.