Packery — это библиотека для организации сетки элементов с динамическим расположением, особенно удобная для работы с нестандартными или асимметричными блоками. Она использует алгоритм «bin-packing», что позволяет оптимально размещать элементы разного размера, минимизируя пустое пространство.
Асимметричные элементы — это блоки, у которых ширина и высота отличаются или которые имеют произвольную форму. Их обработка требует особого внимания к свойствам сетки и к методам Packery.
Для корректного размещения асимметричных элементов важно явно указывать размеры каждого блока. Packery опирается на ширину и высоту элемента, вычисленную через CSS или JavaScript.
.item {
width: 100px;
height: 150px;
}
.item.large {
width: 200px;
height: 300px;
}
В JavaScript размеры можно задавать программно:
var grid = document.querySelector('.grid');
var pckry = new Packery(grid, {
itemSelector: '.item',
gutter: 10
});
Packery автоматически учитывает размеры каждого элемента при
размещении. Если элементы асимметричны, важно использовать правильные
единицы измерения и проверять вычисленные размеры через
getBoundingClientRect().
originLeft и originTopPackery позволяет управлять направлением укладки элементов. Для асимметричных блоков особенно полезны:
var pckry = new Packery(grid, {
itemSelector: '.item',
gutter: 10,
originLeft: true,
originTop: true
});
originLeft — отвечает за расположение элементов слева
направо (при false — справа налево).originTop — отвечает за укладку сверху вниз (при
false — снизу вверх).Эти параметры позволяют корректно управлять асимметричными элементами, чтобы сетка выглядела гармонично даже при нестандартных пропорциях.
fit()Метод fit() позволяет поместить конкретный элемент в
сетку в заданные координаты, что особенно полезно для блоков с
нестандартной формой:
var elem = document.querySelector('.item-large');
pckry.fit(elem, 0, 0);
elem — DOM-элемент.Для асимметричных элементов этот метод помогает избежать наложений и гарантирует точное позиционирование.
stamp()Если нужно, чтобы определённые элементы оставались фиксированными, а
вокруг них укладывались другие асимметричные блоки, используется метод
stamp():
var fixedElem = document.querySelector('.header');
pckry.stamp(fixedElem);
pckry.layout();
Элементы, помеченные как «штамп», не сдвигаются и не участвуют в обычной логике укладки, что полезно при асимметричных блоках с уникальной шириной или высотой.
Для асимметричных элементов важно корректно задать
gutter — промежуток между блоками:
var pckry = new Packery(grid, {
itemSelector: '.item',
gutter: 20
});
Packery распределяет элементы так, чтобы минимизировать пустое пространство, но большие различия в размерах могут создавать визуальные «пробелы». В таких случаях рекомендуется:
gutter значения, адаптирующиеся под
размеры элементов.Для асимметричных элементов важно управлять динамическим изменением DOM:
// Добавление
var newElem = document.createElement('div');
newElem.className = 'item large';
grid.appendChild(newElem);
pckry.appended(newElem);
// Удаление
pckry.remove(newElem);
pckry.layout();
Методы appended() и remove() гарантируют,
что сетка автоматически перерассчитает позиции для всех элементов,
включая асимметричные.
Для элементов с асимметричным содержимым (например, изображения разного размера) важно дождаться загрузки контента перед расчетом сетки:
imagesLoaded(grid, function() {
pckry.layout();
});
Это предотвращает наложение блоков и смещение элементов, что особенно критично для нестандартной высоты и ширины.
percentPositionПри адаптивных сетках рекомендуется использовать процентные значения:
var pckry = new Packery(grid, {
itemSelector: '.item',
gutter: 10,
percentPosition: true
});
Packery предоставляет события, которые помогают отслеживать и контролировать укладку:
pckry.on('layoutComplete', function(items) {
console.log('Сетка обновлена', items);
});
pckry.on('removeComplete', function(items) {
console.log('Элементы удалены', items);
});
Использование событий позволяет реализовать сложную логику, например, динамическую перестановку асимметричных блоков при изменении размеров контейнера.
gutter для плотной
укладки.layout().fit() и stamp() для
точного позиционирования уникальных блоков.Packery обеспечивает гибкую работу с асимметричными элементами, позволяя создавать динамические, адаптивные и визуально привлекательные сетки без сложного ручного позиционирования.