Packery — это библиотека для создания динамических, masonry-подобных сеток в JavaScript, где элементы могут занимать разное пространство, а расположение адаптируется автоматически. Ключевым моментом является правильное определение элементов сетки, так как именно от этого зависит корректная работа алгоритма упаковки.
Элементы сетки задаются с помощью селекторов CSS,
передаваемых в конфигурации Packery через опцию
itemSelector. Это может быть любой валидный CSS-селектор:
класс, идентификатор, тег или их комбинация.
var grid = document.querySelector('.grid');
var pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10
});
.grid — контейнер, в котором будут
располагаться элементы сетки..grid-item — класс, который должен
присутствовать у каждого элемента, чтобы Packery его учитывал.Важно, чтобы все элементы, которые будут
позиционироваться, имели одинаковый селектор. Любые вложенные
или вспомогательные элементы внутри grid-item не должны
использоваться в качестве отдельных элементов сетки.
Packery автоматически определяет размеры элементов на основе их
ширины и высоты в пикселях, включая
padding и border. Для корректной работы часто
используют фиксированные размеры через CSS:
.grid-item {
width: 150px;
height: 100px;
}
Если элементы имеют динамическую высоту, Packery корректно их распределяет, но необходимо учитывать загрузку изображений, иначе размеры будут рассчитаны неправильно. В таких случаях используют библиотеку imagesLoaded для ожидания полной загрузки контента:
imagesLoaded(grid, function() {
pckry.layout();
});
Packery поддерживает элементы с разными размерами, которые могут занимать больше одного “слота” сетки. Для этого можно использовать CSS классы с указанием ширины и высоты в ячейках:
.grid-item--width2 { width: 300px; }
.grid-item--height2 { height: 200px; }
При этом Packery автоматически вычисляет, сколько “ячейок” занимает каждый элемент. Такой подход особенно полезен при создании сложных, разноразмерных сеток, где элементы визуально разнообразны.
Помимо селекторов CSS, можно добавлять и удалять элементы динамически через методы Packery:
var item = document.createElement('div');
item.className = 'grid-item';
grid.appendChild(item);
pckry.appended(item);
pckry.layout();
appended(item) сообщает Packery, что добавлен новый
элемент.layout() пересчитывает расположение всех
элементов.Аналогично работают методы remove() и
reloadItems() для управления элементами после изменений
DOM.
Packery учитывает только прямые потомки контейнера,
указанные селектором itemSelector. Вложенные структуры не
будут восприниматься как отдельные элементы сетки, что позволяет
создавать сложные карточки с внутренними блоками без нарушения алгоритма
расположения.
<div class="grid">
<div class="grid-item">
<div class="content">
<p>Текст и изображения</p>
</div>
</div>
</div>
В этом примере только .grid-item участвует в
позиционировании, а .content служит визуальным
контейнером.
itemSelector.appended,
remove, reloadItems,
layout).itemSelector.Правильное определение элементов является фундаментом для построения гибких и визуально гармоничных сеток с Packery.