Для начала работы с Packery необходимо подключить саму библиотеку и её зависимости. Packery основан на библиотеке Draggabilly для поддержки перетаскивания элементов, поэтому рекомендуется подключить её для расширенной функциональности. Подключение может выполняться как через CDN, так и через менеджеры пакетов, такие как npm.
Пример подключения через CDN:
<link rel="stylesheet" href="https://unpkg.com/packery@2/dist/packery.pkgd.min.css">
<script src="https://unpkg.com/packery@2/dist/packery.pkgd.min.js"></script>
<script src="https://unpkg.com/draggabilly@2/dist/draggabilly.pkgd.min.js"></script>
Пример установки через npm:
npm install packery
npm install draggabilly
После установки через npm библиотеку можно импортировать в проект:
import Packery from 'packery';
import Draggabilly from 'draggabilly';
Основной класс Packery позволяет создавать сетку, в которой элементы автоматически располагаются в оптимальном порядке. Для инициализации необходимо указать контейнер и конфигурацию.
const grid = document.querySelector('.grid');
const pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10,
percentPosition: true
});
Ключевые параметры:
true, размеры
элементов рассчитываются в процентах относительно контейнера.Packery поддерживает динамическое добавление элементов в сетку с
помощью метода appended. Этот метод позволяет вставлять
новые элементы и автоматически перераспределять существующие.
const newItems = document.createElement('div');
newItems.className = 'grid-item';
newItems.textContent = 'Новый элемент';
grid.appendChild(newItems);
pckry.appended(newItems);
Особенности метода appended:
const moreItems = document.querySelectorAll('.new-items');
pckry.appended(moreItems);
Packery интегрируется с Draggabilly для реализации drag-and-drop. После добавления новых элементов можно включить возможность перетаскивания:
const itemElems = pckry.getItemElements();
itemElems.forEach((itemElem) => {
const draggie = new Draggabilly(itemElem);
pckry.bindDraggabillyEvents(draggie);
});
Особенности:
При динамическом изменении размеров или добавлении контента может потребоваться перераспределение элементов:
pckry.layout();
Важно помнить:
layout() пересчитывает позиции всех элементов в
сетке.fit,
чтобы переместить их в свободное место:pckry.fit(newItems[0]);
Packery предоставляет возможность удаления элементов из сетки и DOM:
pckry.remove(newItems);
pckry.layout();
newItems.forEach(item => item.parentNode.removeChild(item));
Пошаговая логика:
remove() уведомляет Packery, что элемент больше
не участвует в сетке.layout() пересчитывает расположение оставшихся
элементов.Packery поддерживает события для отслеживания изменений сетки:
pckry.on('layoutComplete', (items) => {
console.log('Сетка обновлена', items);
});
pckry.on('removeComplete', (items) => {
console.log('Элементы удалены', items);
});
Популярные события:
layoutComplete — после пересчёта сетки.dragItemPositioned — после перемещения элемента.removeComplete — после удаления элементов.fitComplete — после размещения элемента методом
fit.Элементы с классом stamp можно использовать для создания
“неподвижных” блоков, вокруг которых Packery будет располагать
остальные:
const stampElem = document.querySelector('.stamp');
pckry.stamp(stampElem);
pckry.layout();
Особенности работы:
Для создания адаптивных сеток с процентными колонками рекомендуется
использовать параметр percentPosition и CSS:
.grid {
width: 100%;
}
.grid-item {
width: 30%;
}
При изменении ширины окна Packery автоматически перераспределяет элементы:
window.addEventListener('resize', () => {
pckry.layout();
});
appended.requestAnimationFrame при
частых обновлениях размеров или динамическом контенте.layout() только после всех изменений.Эти возможности делают Packery мощным инструментом для создания динамических и адаптивных сеток, управления позициями элементов и интеграции с drag-and-drop функционалом в современных интерфейсах.