Фиксированные элементы

Packery — это библиотека для динамической компоновки элементов на веб-странице с использованием сетки, где каждый блок может располагаться с минимальными промежутками. Одной из важных особенностей является возможность работы с фиксированными элементами. Фиксированные элементы — это блоки, которые остаются на своей позиции независимо от того, как перераспределяются остальные элементы сетки. Они особенно полезны при создании сложных макетов, где часть контента должна быть закреплена.


Основы фиксации элементов

В Packery фиксация реализуется через свойство isStatic. Этот параметр указывается при инициализации сетки или при добавлении отдельного элемента. Пример базовой конфигурации:

var grid = document.querySelector('.grid');
var pckry = new Packery(grid, {
  itemSelector: '.grid-item',
  gutter: 10
});

// Получаем элемент и делаем его фиксированным
var fixedItem = document.querySelector('.fixed-item');
pckry.items.forEach(function(item){
  if(item.element === fixedItem){
    item.isStatic = true;
  }
});

// Перестроение сетки с учётом фиксации
pckry.layout();

Ключевые моменты:

  • isStatic: true блокирует перемещение элемента при вызове layout().
  • Фиксированные элементы не учитываются при перестановке других блоков только в части своей позиции, но они участвуют в расчёте свободного пространства.

Динамическое добавление фиксированных элементов

Packery позволяет добавлять новые элементы после инициализации сетки. Фиксация может применяться сразу при добавлении:

var newItem = document.createElement('div');
newItem.className = 'grid-item fixed-item';
grid.appendChild(newItem);

pckry.appended(newItem);
pckry.getItem(newItem).isStatic = true;
pckry.layout();

Особенность динамического добавления:

  • Фиксированный элемент занимает место в сетке, и остальные элементы подстраиваются под него.
  • Можно комбинировать фиксированные и обычные элементы без конфликтов.

Взаимодействие с draggable элементами

Packery интегрируется с библиотекой Draggabilly, что позволяет перетаскивать элементы сетки. Фиксированные элементы ведут себя особым образом:

  • Элементы с isStatic: true невозможно перетащить, они игнорируют события Draggabilly.
  • Если необходимо временно сделать фиксированный элемент перемещаемым, достаточно изменить флаг:
var item = pckry.getItem(fixedItem);
item.isStatic = false;
pckry.layout();

После этого элемент станет интерактивным и сможет быть перемещён мышью.


Использование CSS для фиксации

Packery работает с положением через transform и position: absolute. Для фиксированных элементов рекомендуется задавать CSS классы:

.fixed-item {
  background-color: #f0f0f0;
  border: 2px solid #333;
}

Фиксированный элемент не требует специальных CSS-свойств для фиксации, достаточно контролировать это через isStatic. Однако стили помогают визуально отличать его от обычных блоков.


Случаи использования фиксированных элементов

  1. Шапки и боковые панели: В макетах, где часть контента должна оставаться на месте при перестроении сетки.
  2. Выделенные блоки: Например, рекламные баннеры или важные карточки товаров.
  3. Смешанные макеты: Комбинация фиксированных элементов и динамических карточек позволяет создавать нестандартные, «журнальные» сетки.

Перестроение сетки с учётом фиксированных элементов

Packery автоматически учитывает isStatic при вызове методов layout и fit. Важные моменты:

  • pckry.layout() перераспределяет только нефиксированные элементы.
  • Если фиксированный элемент занимает значительное пространство, Packery подстроит все остальные блоки вокруг него.
  • При изменении размеров или добавлении элементов необходимо вызывать layout() повторно.
window.addEventListener('resize', function(){
  pckry.layout();
});

Это гарантирует, что сетка останется корректной на любых разрешениях экрана.


Ограничения и нюансы

  • Фиксированные элементы не могут занимать одно и то же место, иначе Packery сгенерирует перекрытие.
  • Комбинация множества фиксированных элементов увеличивает сложность перестроения, особенно при динамическом добавлении новых блоков.
  • Для оптимизации производительности рекомендуется фиксировать только ключевые блоки, а остальные делать динамическими.

Фиксированные элементы в Packery обеспечивают мощный инструмент для создания гибких и визуально привлекательных макетов. Контроль через isStatic и грамотная интеграция с Draggabilly позволяет сочетать стабильность расположения и интерактивность сетки.