Packery — это библиотека для создания динамических сеток с возможностью «встройки» элементов друг в друга, похожая на Masonry, но с более гибкой логикой расположения. Для работы с Packery необходимо подключить сам скрипт и стили для контейнера и элементов.
import Packery from 'packery';
const grid = document.querySelector('.grid');
const pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10,
percentPosition: true
});
true,
координаты рассчитываются в процентах, что полезно для адаптивных
сеток.fitCompleteМетод fitComplete предназначен для работы с анимациями
при перемещении элементов. Он вызывается автоматически после завершения
операции fit, когда элемент перемещается на новое место в
сетке.
pckry.on('fitComplete', (item) => {
console.log('Элемент завершил перемещение:', item.element);
});
fitComplete удобно использовать для запуска
сторонних анимаций или синхронизации других компонентов интерфейса.fit и
fitCompleteМетод fit перемещает элемент в указанное место
сетки:
pckry.fit(itemElement, x, y);
fit элемент начинает анимацию
перемещения.Это разделение важно для контроля синхронизации: нельзя полагаться на
мгновенное завершение fit, если требуется выполнять
действия после позиционирования.
const filterButton = document.querySelector('#filter');
filterButton.addEventListener('click', () => {
const items = grid.querySelectorAll('.grid-item');
items.forEach(item => {
if (!item.classList.contains('active')) {
pckry.fit(item, 0, 0); // перемещаем скрытые элементы
}
});
});
pckry.on('fitComplete', (item) => {
item.element.style.opacity = 1; // плавное появление после перемещения
});
grid.addEventListener('dragend', (event) => {
const item = event.target;
const newX = item.offsetLeft;
const newY = item.offsetTop;
pckry.fit(item, newX, newY);
});
pckry.on('fitComplete', (item) => {
console.log('Элемент переставлен:', item.element.dataset.id);
});
dragend используется вместе с Packery для
обновления позиции элемента после перетаскивания.fitComplete гарантирует, что все вычисления позиции
завершены до выполнения логики обновления данных.Packery поддерживает CSS-переходы и анимацию через свойства
transition. В сочетании с fitComplete можно
плавно менять свойства элементов:
.grid-item {
transition: transform 0.4s ease, opacity 0.4s ease;
}
pckry.on('fitComplete', (item) => {
item.element.classList.add('highlight');
setTimeout(() => {
item.element.classList.remove('highlight');
}, 500);
});
fitComplete обеспечивает точное время
запуска анимаций после физического перемещения элементов.Packery позволяет связывать fitComplete с другими
событиями: dragItemPositioned, layoutComplete,
removeComplete. Это полезно при построении интерактивных
интерфейсов, где требуется последовательное выполнение действий после
изменения сетки.
pckry.on('layoutComplete', () => {
console.log('Сетка полностью перестроена');
});
pckry.on('fitComplete', (item) => {
console.log('Отдельный элемент завершил перемещение');
});
layoutComplete срабатывает после полной перестройки
сетки, включая все элементы.fitComplete работает на уровне отдельного элемента, что
дает более точный контроль для анимаций и событий.fit одновременно, чтобы избежать проседания
производительности.percentPosition: true и CSS transition для
плавного изменения положения.fitComplete идеально подходит для связывания
перемещения с визуальными эффектами, событиями загрузки или асинхронными
действиями.Сочетание методов fit и события fitComplete
делает Packery мощным инструментом для создания динамических сеток с
точным контролем над анимацией и расположением элементов.