Packery — это мощная библиотека для организации сеток с элементами разного размера и формы, предоставляющая гибкие алгоритмы укладки. Основная сила Packery заключается в возможности комбинировать различные подходы: фиксированные размеры элементов, динамическое изменение размеров, drag-and-drop и фильтрацию элементов. Эти методы позволяют создавать сложные, адаптивные интерфейсы, где элементы “упаковываются” оптимально, без лишних промежутков.
Создание сетки начинается с инициализации контейнера:
var grid = document.querySelector('.grid');
var pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10,
percentPosition: true
});
Ключевые параметры:
itemSelector — CSS-селектор для элементов сетки.gutter — промежуток между элементами в пикселях.percentPosition — включение процентных координат, что
особенно важно для адаптивных макетов.Каждый элемент может иметь фиксированные размеры через CSS или динамические размеры, вычисляемые в Jav * aScript:
var item = document.createElement('div');
item.className = 'grid-item';
item.style.width = '150px';
item.style.height = '200px';
grid.appendChild(item);
pckry.appended(item);
Packery интегрируется с библиотекой Draggabilly для перемещения элементов:
var draggies = [];
pckry.getItemElements().forEach(function(itemElem) {
var draggie = new Draggabilly(itemElem);
pckry.bindDraggabillyEvents(draggie);
draggies.push(draggie);
});
Особенности:
Packery позволяет менять размеры элементов на лету и перестраивать сетку:
item.style.width = '300px';
item.style.height = '100px';
pckry.fit(item); // Переставляет элемент на новое место
pckry.layout(); // Пересчитывает всю сетку
Применение:
Фильтрация элементов может быть выполнена с помощью CSS-классов:
function filterItems(category) {
pckry.getItemElements().forEach(function(item) {
if (item.classList.contains(category)) {
item.style.display = '';
} else {
item.style.display = 'none';
}
});
pckry.layout();
}
Особенности:
Packery поддерживает события, которые позволяют создавать сложные взаимодействия:
pckry.on('layoutComplete', function(items) {
console.log('Сетка обновлена', items.length, 'элементов');
});
pckry.on('dragItemPositioned', function(item) {
console.log('Элемент перемещен:', item.element);
});
Применение:
Packery может работать как расширение Masonry, применяя похожий алгоритм упорядочивания, но с учетом свободных пустот.
layoutComplete для синхронизации.fit() и layout() по
завершении.var pckry = new Packery('.grid', { itemSelector: '.grid-item', gutter: 10 });
pckry.getItemElements().forEach(function(item) {
var draggie = new Draggabilly(item);
pckry.bindDraggabillyEvents(draggie);
});
document.querySelectorAll('.filter-button').forEach(function(button) {
button.addEventListener('click', function() {
var category = this.dataset.category;
pckry.getItemElements().forEach(function(item) {
item.style.display = item.classList.contains(category) ? '' : 'none';
});
pckry.layout();
});
});
window.addEventListener('resize', function() {
pckry.layout();
});
В этом сценарии одновременно работают: перетаскивание, фильтрация, адаптивная перестройка сетки, что демонстрирует мощь комбинированного подхода Packery.
Эффективное использование этих методов позволяет создавать интерфейсы с высокой интерактивностью, плавной анимацией и оптимальным использованием пространства без лишних промежутков.