Packery — это библиотека для создания динамических сеток с произвольными элементами, где можно точно управлять положением и размером блоков. Важнейшей концепцией является возможность задавать фиксированные значения для элементов сетки: ширину, высоту, позиции и отступы. Это позволяет добиться строгого контроля над визуальной компоновкой и сохранить согласованность интерфейса при изменении размеров контейнера или контента.
Элементы в Packery можно задавать с помощью статических CSS-значений или через опции самого Packery. Наиболее часто используются следующие подходы:
.grid-item {
width: 200px;
height: 150px;
}
Эти значения гарантируют, что Packery будет учитывать элемент как фиксированный блок, независимо от количества соседних элементов. При изменении контейнера элементы не будут сжиматься или растягиваться автоматически.
Для более гибкого контроля можно использовать опцию
itemSelector:
var grid = document.querySelector('.grid');
var pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10
});
itemSelector указывает Packery, какие элементы
учитывать при компоновке.gutter задаёт фиксированный промежуток между блоками,
что критично для сеток с одинаковыми размерами элементов.Packery поддерживает фиксированные позиции через
координаты. Для этого используется метод fit или
stamp. Например:
pckry.fit(document.querySelector('.special-item'), 0, 0);
Здесь .special-item будет размещён в верхнем
левом углу сетки, независимо от других элементов. Этот метод
полезен, когда нужно закрепить ключевой элемент интерфейса в
определённой позиции.
Опция stamp позволяет выделить несколько элементов,
которые Packery не перемещает, а остальные блоки
располагаются вокруг них:
pckry.stamp(document.querySelectorAll('.pinned'));
pckry.layout();
stamp — фиксирует элементы.layout() — пересчитывает позиции остальных элементов с
учётом закреплённых блоков.Packery использует концепцию gutter и columnWidth/rowHeight, чтобы обеспечить строгую сеточную структуру:
var pckry = new Packery(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
rowHeight: 150,
gutter: 20
});
columnWidth и rowHeight задают
фиксированные размеры ячеек сетки, что особенно важно
при адаптивном дизайне.gutter создаёт равномерные промежутки между элементами,
предотвращая наложение блоков.Использование этих опций вместе с фиксированными размерами элементов позволяет создавать сбалансированные и предсказуемые сетки.
Packery автоматически пересчитывает сетку при изменении размеров элементов, но при фиксированных значениях важно обновлять layout вручную, чтобы сохранить правильное расположение:
var item = document.querySelector('.grid-item');
item.style.height = '200px';
pckry.layout();
layout().Для динамически добавляемых блоков используется метод
appended:
var newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.style.width = '200px';
newItem.style.height = '150px';
grid.appendChild(newItem);
pckry.appended(newItem);
Это гарантирует, что новый элемент примет фиксированные размеры и правильно встроится в сетку.
Использование фиксированных размеров и позиций повышает предсказуемость сетки, но накладывает ограничения:
width и
height, если требуется строгая фиксация.columnWidth и
rowHeight.Эти ограничения следует учитывать при проектировании интерфейса, особенно при работе с динамическим контентом или responsive-дизайном.
columnWidth,
rowHeight и gutter для синхронизации
сетки с размерами элементов.stamp или
fit для контроля их позиции.layout() после изменения размеров
элементов или добавления новых блоков.Следуя этой стратегии, можно создавать сетки с абсолютно предсказуемым поведением, что особенно важно для сложных интерфейсов, где точное расположение блоков критично.