Программное управление адаптивностью

Gridstack.js предоставляет мощный инструмент для создания адаптивных сеток на веб-страницах, где элементы могут динамически изменять свои размеры и позиции. Ключевой принцип управления адаптивностью — это работа с опциями сетки и методами API, которые позволяют управлять поведением виджетов при изменении размера экрана или контейнера.


Настройка сетки для адаптивного поведения

Для начала необходимо инициализировать сетку с учетом адаптивности:

const grid = GridStack.init({
  cellHeight: 100,
  verticalMargin: 10,
  float: true,
  disableOneColumnMode: false,
  column: 12,
  animate: true,
});

Ключевые параметры:

  • cellHeight — высота ячейки в пикселях, может быть функцией для динамической подгонки.
  • verticalMargin — вертикальный отступ между виджетами.
  • float — позволяет элементам плавно перемещаться вверх при освобождении места.
  • disableOneColumnMode — если false, при узком экране сетка автоматически переходит в одну колонку.
  • column — количество колонок сетки по умолчанию.
  • animate — анимация перемещения и изменения размеров.

Управление колонками при изменении размера экрана

Gridstack.js позволяет программно изменять количество колонок в зависимости от ширины контейнера или окна:

window.addEventListener('resize', () => {
  const width = window.innerWidth;
  if (width < 768) {
    grid.column(1); // мобильный режим
  } else if (width < 1200) {
    grid.column(6); // планшет
  } else {
    grid.column(12); // десктоп
  }
});

Важно: изменение количества колонок автоматически перестраивает сетку, сохраняя относительные позиции виджетов. Для плавного перехода рекомендуется включить опцию animate.


Программное изменение размеров и положения виджетов

Gridstack.js предоставляет методы для динамического управления виджетами:

  • update(el, opts) — обновление позиции и размеров конкретного элемента.

    grid.update(widgetElement, {x: 2, y: 1, width: 4, height: 2});
  • move(el, x, y) — перемещение виджета в указанную ячейку.

  • resize(el, width, height) — изменение размеров виджета без перемещения.

Использование этих методов позволяет создавать адаптивные сценарии, где виджеты перестраиваются под условия конкретного устройства.


Поддержка нескольких медиа-размеров

Gridstack.js поддерживает breakpoints через конфигурацию responsiveGrid или программную логику. Это позволяет заранее задать параметры виджетов для разных ширин экрана:

const breakpoints = {
  lg: 12, // ≥1200px
  md: 6,  // ≥768px
  sm: 1   // <768px
};

function applyColumns() {
  const width = window.innerWidth;
  if (width >= 1200) grid.column(breakpoints.lg);
  else if (width >= 768) grid.column(breakpoints.md);
  else grid.column(breakpoints.sm);
}

window.addEventListener('resize', applyColumns);
applyColumns();

Такой подход позволяет полностью контролировать адаптивность сетки, обеспечивая стабильное расположение виджетов на любых устройствах.


Управление поведением виджетов при адаптации

Для повышения гибкости применяются следующие техники:

  1. Минимальные и максимальные размеры:

    grid.update(widgetElement, {minWidth: 2, maxWidth: 6, minHeight: 1, maxHeight: 3});

    Это предотвращает разрушение макета при резком изменении размера контейнера.

  2. Перемещение с ограничениями: Можно задать locked: true, чтобы элемент не изменял положение на малых экранах, или использовать коллбэки resizestop и dragstop для динамической коррекции.

  3. Динамическое добавление и удаление виджетов:

    grid.addWidget(`<div class="grid-stack-item" data-gs-width="4" data-gs-height="2"></div>`);
    grid.removeWidget(widgetElement);

    Это позволяет создавать адаптивные интерфейсы с изменяемым количеством элементов в зависимости от устройства.


Использование API событий для адаптивной логики

Gridstack.js генерирует события при изменении размеров или позиции виджетов:

  • change — любое изменение сетки.
  • added / removed — добавление или удаление виджетов.
  • resizestart / resizestop — начало и конец изменения размеров.
  • dragstart / dragstop — начало и конец перетаскивания.

Пример отслеживания адаптивных изменений:

grid.on('change', function(event, items) {
  items.forEach(item => {
    if (item.width > 6) {
      item.el.style.backgroundColor = 'lightblue';
    } else {
      item.el.style.backgroundColor = '';
    }
  });
});

Такой подход позволяет программно подстраивать интерфейс под текущие условия, создавая адаптивные и интерактивные панели.


Динамическая настройка ячеек и отступов

Для сложных адаптивных макетов полезно управлять параметрами сетки в реальном времени:

grid.cellHeight(80);        // изменение высоты ячеек
grid.verticalMargin(5);     // изменение вертикального отступа
grid.float(true);           // разрешение «плавающих» виджетов

Эти методы дают полный контроль над визуальной структурой сетки без пересоздания контейнера.


Интеграция с фреймворками

Gridstack.js легко интегрируется с React, Angular или Vue, где адаптивность часто требуется при динамическом изменении состояния. Основная стратегия — хранить состояние виджетов и их параметры сетки в глобальном или компонентном состоянии и применять методы update, move и resize при изменении состояния или размеров контейнера.


Резюме ключевых инструментов адаптивности

  • Инициализация с параметрами column, float, disableOneColumnMode.
  • Программное изменение колонок через grid.column().
  • Управление виджетами: update(), resize(), move().
  • Минимальные и максимальные размеры, блокировка перемещения.
  • События change, resizestop, dragstop для динамической подстройки.
  • Реакция на window.resize с логикой breakpoints.
  • Динамическое добавление и удаление виджетов.

Эти инструменты обеспечивают гибкую и детально контролируемую адаптивность сетки, позволяя создавать интерфейсы, которые одинаково хорошо работают на мобильных устройствах, планшетах и десктопах.