Gridstack.js предоставляет мощный и гибкий API для динамического управления сеткой и её элементами. Одним из ключевых аспектов является управление колонками сетки, что позволяет адаптировать интерфейс под разные устройства, создавать интерактивные панели и динамически изменять структуру контента.
Количество колонок задаётся через опцию column при
инициализации сетки:
const grid = GridStack.init({
column: 12
});
Ключевой момент: изменение числа колонок влияет на перераспределение всех виджетов в сетке. Если сетка уже содержит элементы, их позиции будут пересчитаны автоматически, чтобы сохранить видимость и непротиворечивость расположения.
Для динамического изменения количества колонок после инициализации используется метод:
grid.column(8); // уменьшение числа колонок до 8
Gridstack.js пересчитает позиции виджетов по новой сетке, сохраняя их относительные размеры и расположение. Если виджеты не помещаются в новую конфигурацию, они будут перемещены вниз или сжаты в пределах доступной площади.
Для проверки текущей конфигурации используется метод:
let currentColumns = grid.getColumn();
console.log(currentColumns); // выводит текущее число колонок
Этот метод полезен при адаптивном дизайне, когда сетка должна изменять структуру в зависимости от ширины окна или других условий.
Каждый виджет в сетке имеет свойства x, y,
w и h, где:
x — индекс колонки, в которой начинается виджетy — индекс строки, в которой начинается виджетw — ширина виджета в колонкахh — высота виджета в строкахИзменение ширины виджета динамически:
const widget = grid.getWidgetById('widget1'); // или любой другой способ получения элемента
grid.update(widget, {w: 6}); // устанавливаем ширину в 6 колонок
Важно: при изменении ширины виджета Gridstack автоматически проверяет доступное пространство и при необходимости перемещает соседние элементы, чтобы избежать наложений.
Для программного перемещения используется метод
update():
grid.update(widget, {x: 3, y: 1}); // перемещаем виджет в колонку с индексом 3, строку 1
Если указанная позиция занята, Gridstack.js попытается найти ближайшее свободное место ниже, обеспечивая корректное размещение без конфликтов.
Gridstack.js не поддерживает прямого добавления отдельной колонки без
изменения общего числа колонок. Любое изменение структуры выполняется
через метод column(). Например, для добавления колонок:
grid.column(grid.getColumn() + 2); // увеличиваем число колонок на 2
Для уменьшения количества колонок необходимо учитывать, что виджеты могут быть автоматически смещены вниз или уменьшены в ширине, чтобы соответствовать новой сетке.
Gridstack.js позволяет интегрировать адаптивные правила. Например, изменение числа колонок при изменении ширины окна:
window.addEventListener('resize', () => {
if (window.innerWidth < 768) {
grid.column(4); // мобильный режим
} else if (window.innerWidth < 1200) {
grid.column(8); // планшет
} else {
grid.column(12); // десктоп
}
});
Совет: рекомендуется использовать события
change и resizestop, чтобы корректно
обрабатывать перераспределение виджетов после изменения количества
колонок.
Gridstack поддерживает вложенные сетки, каждая из которых может иметь собственное количество колонок:
const nestedGrid = GridStack.init({
column: 6
}, document.querySelector('.nested-grid'));
При изменении родительской сетки важно учитывать, что вложенная сетка сохраняет свои колонки, но визуальное пространство может быть ограничено размерами родительского виджета.
grid.column([number]) — установка или получение
количества колонокgrid.update(el, {x, y, w, h}) — перемещение и изменение
размера виджетаgrid.on('change', callback) — отслеживание изменений
позиции и размера виджетовgrid.on('resizestop', callback) — фиксация
окончательного изменения после ресайзаИспользование этих методов в комбинации позволяет создавать динамические панели, которые автоматически адаптируются к числу колонок и корректно перераспределяют элементы.
grid.update(widget, {w: 3});
grid.update(widget2, {w: 4});
grid.update(widget, {x: grid.getColumn() - widget.getAttribute('gs-w'), y: 0});
const setColumns = () => {
const width = window.innerWidth;
grid.column(width < 600 ? 2 : width < 1024 ? 6 : 12);
};
window.addEventListener('resize', setColumns);
setColumns();
Эти подходы обеспечивают полный контроль над расположением колонок, возможность динамически изменять сетку и адаптировать интерфейс под разные сценарии.