Gridstack.js — это библиотека для создания интерактивных сеточных интерфейсов, позволяющая легко управлять расположением виджетов на странице. Одной из ключевых возможностей является динамическое изменение количества колонок сетки, что особенно важно для адаптивного дизайна и интерфейсов, где размер контейнера может изменяться.
При инициализации сетки количество колонок задаётся через опцию
column:
const grid = GridStack.init({
column: 12,
float: true,
animate: true
});
column — количество колонок сетки по умолчанию.float — разрешает свободное смещение виджетов при
переносе.animate — добавляет анимацию при перемещении
элементов.Каждая ячейка сетки (grid item) при этом получает
ширину, рассчитанную автоматически исходя из числа колонок.
Gridstack.js предоставляет метод column() для
динамического изменения количества колонок после
инициализации:
grid.column(8); // изменяем сетку на 8 колонок
При вызове этого метода библиотека автоматически перераспределяет все виджеты, сохраняя их относительное положение.
Важно понимать, что:
Для создания адаптивного интерфейса удобно связывать количество колонок с размером окна. Например:
function updateColumns() {
const width = window.innerWidth;
if (width < 600) grid.column(2);
else if (width < 900) grid.column(4);
else grid.column(12);
}
window.addEventListener('resize', updateColumns);
updateColumns();
Здесь количество колонок меняется автоматически при изменении ширины окна. При этом Gridstack.js корректно перераспределяет виджеты, предотвращая наложение элементов.
При динамическом изменении колонок часто важно сохранять
позиции виджетов. Gridstack.js поддерживает методы
save() и load():
const serializedData = grid.save(); // сохраняем текущее состояние
grid.column(6); // меняем количество колонок
grid.load(serializedData); // восстанавливаем позиции с учётом новых колонок
Метод load() автоматически масштабирует позиции и
размеры элементов в соответствии с новой конфигурацией колонок.
auto и resizableЕсли сетка использует auto-ширину или элементы имеют
возможность изменения размеров:
column() и resize() работают
совместно, корректируя размеры виджетов.grid.compact() после изменения колонок, чтобы убрать пустые
промежутки.grid.column(10);
grid.compact();
compact() перераспределяет виджеты по сетке, минимизируя
пустое пространство.
w и h каждого элемента для
корректного масштабирования.change и resizestop позволяют отслеживать
изменения и сохранять состояние.grid.on('change', function(event, items) {
console.log('Состояние изменилось', items);
});
width: 100%, чтобы автоматическое перераспределение
работало корректно.const grid = GridStack.init({
column: 12,
float: true
});
window.addEventListener('resize', () => {
const width = document.body.clientWidth;
if (width < 480) grid.column(1);
else if (width < 768) grid.column(3);
else if (width < 1024) grid.column(6);
else grid.column(12);
});
Этот подход позволяет сетке оставаться гибкой и адаптивной на любых устройствах, автоматически изменяя количество колонок и размеры виджетов без ручной перестройки.
grid.column(newValue).compact() для оптимального
распределения.Эта последовательность позволяет создавать динамические, гибкие и отзывчивые интерфейсы, полностью используя возможности Gridstack.js.