Packery — это библиотека для построения динамических сеток с «вылетающими» элементами и свободной компоновкой. Она позволяет создавать адаптивные, нестандартные макеты, где элементы могут занимать переменные размеры и позиционироваться без строгой сетки, используя физический принцип «упаковки» (packing).
Для начала работы с Packery необходимо подключить библиотеку к проекту и создать контейнер с элементами:
<div class="grid">
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
const grid = document.querySelector('.grid');
const pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10,
percentPosition: true
});
Packery автоматически учитывает размеры элементов. Для точного контроля можно использовать CSS:
.grid-item {
width: 100px;
height: 100px;
}
Если элементы имеют переменные размеры, Packery корректно размещает их, избегая пустых промежутков.
Packery интегрируется с Draggabilly для перетаскивания:
const draggies = [];
pckry.getItemElements().forEach(itemElem => {
const draggie = new Draggabilly(itemElem);
pckry.bindDraggabillyEvents(draggie);
draggies.push(draggie);
});
bindDraggabillyEvents позволяет библиотеке корректно
перестраивать сетку после перемещения элемента.Добавление нового элемента:
const newItem = document.createElement('div');
newItem.className = 'grid-item';
grid.appendChild(newItem);
pckry.appended(newItem);
Удаление элемента:
pckry.remove(itemElem);
pckry.layout();
Packery поддерживает автоматическое перераспределение элементов при изменении размеров окна:
window.addEventListener('resize', () => {
pckry.layout();
});
Использование layout гарантирует, что сетка останется
аккуратной и элементы не будут перекрываться.
Пример использования stamp:
const stampElement = document.querySelector('.stamp');
pckry.stamp(stampElement);
pckry.layout();
Packery поддерживает анимации через CSS, управляемые свойством
transition:
.grid-item {
transition: transform 0.4s ease;
}
Каждое перемещение или перестройка сетки будет плавно анимироваться.
Packery предоставляет события для контроля жизненного цикла элементов:
pckry.on('layoutComplete', items => {
console.log('Сетка перестроена', items);
});
pckry.on('dragItemPositioned', item => {
console.log('Элемент перемещён', item);
});
transitionDuration для плавных анимаций,
но не чрезмерно длинных, чтобы не тормозить рендер.Packery отлично подходит для адаптивного дизайна. Использование
percentPosition и медиазапросов позволяет сетке корректно
перестраиваться при любых размерах экрана. Важно учитывать, что при
значительном изменении размеров элементов или контейнера рекомендуется
вызывать layout() для перерасчета позиций.
Для доступности необходимо следить за структурой HTML:
role="region".aria-label и
tabindex.aria-live="polite", чтобы
screen readers уведомляли пользователя о новых элементах.Пример для доступного элемента:
<div class="grid-item" role="region" aria-label="Новое изображение" tabindex="0"></div>
Это позволяет пользователям со вспомогательными технологиями отслеживать изменения сетки, не нарушая визуальной свободы Packery.