Для начала работы с библиотекой Packery необходимо подключить её в проект. Существует несколько способов: через CDN или установкой через npm/yarn.
Через CDN:
<script src="https://unpkg.com/packery@2/dist/packery.pkgd.min.js"></script>
Через npm:
npm install packery
После установки через npm можно импортировать библиотеку в Jav * aScript:
import Packery from 'packery';
Packery изначально рассчитан на вертикальное размещение элементов, но
с помощью опции horizontal можно построить
горизонтальный поток блоков. Это особенно удобно для
галерей, каруселей и интерфейсов с горизонтальной прокруткой.
const grid = document.querySelector('.grid');
const pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10,
horizontal: true
});
Ключевые параметры:
itemSelector — CSS-селектор элементов сетки.gutter — отступ между элементами.horizontal — флаг, активирующий горизонтальное
размещение.В горизонтальном режиме Packery выстраивает элементы слева направо, заполняя ряды по высоте контейнера. Высота контейнера критична: если не задать явно, элементы могут накладываться или обрезаться.
.grid {
width: 100%;
height: 300px; /* фиксированная высота для горизонтального потока */
position: relative;
}
.grid-item {
width: 150px;
height: 150px;
margin-bottom: 10px; /* вертикальный промежуток внутри ряда */
background-color: #3498db;
}
Packery позволяет добавлять новые элементы динамически и автоматически перестраивать сетку:
const newItem = document.createElement('div');
newItem.classList.add('grid-item');
grid.appendChild(newItem);
pckry.appended(newItem);
pckry.layout();
Для удаления:
const itemToRemove = grid.querySelector('.grid-item:last-child');
pckry.remove(itemToRemove);
pckry.layout();
Использование методов appended и remove
гарантирует корректное обновление горизонтальной компоновки.
Packery интегрируется с библиотекой Draggabilly для перетаскивания элементов. В горизонтальной сетке важно учитывать ось перемещения:
import Draggabilly from 'draggabilly';
pckry.getItemElements().forEach(itemElem => {
const draggie = new Draggabilly(itemElem, { axis: 'x' });
pckry.bindDraggabillyEvents(draggie);
});
Особенности:
axis: 'x' ограничивает движение по горизонтали.Горизонтальные сетки часто требуют адаптивного
поведения. При изменении ширины контейнера необходимо вызвать
layout:
window.addEventListener('resize', () => {
pckry.layout();
});
Для адаптивных сеток можно комбинировать gutter и
itemSelector с CSS-свойством flex-basis или
width: auto для гибкой ширины элементов.
Packery допускает смешение стилей: можно иметь горизонтальный поток с masonry-подобным заполнением по высоте. Для этого важно:
percentPosition: true для масштабирования
относительно контейнера;gutter для точного выравнивания.const pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10,
horizontal: true,
percentPosition: true
});
При больших наборах элементов горизонтальные сетки могут тормозить. Рекомендуется:
transform: translate3d для анимаций;appended для всех сразу, а потом один раз
layout.Packery поддерживает плавное расположение элементов через CSS-переходы:
.grid-item {
transition: transform 0.4s ease;
}
При горизонтальном размещении это обеспечивает естественное движение блоков, когда добавляются новые элементы или происходит перетаскивание.
Горизонтальный режим Packery предоставляет гибкость для создания качественных горизонтальных галерей, слайдеров и интерфейсов с прокруткой, при этом оставляя полный контроль над позиционированием и динамическими изменениями элементов.