Packery — это библиотека для динамического и адаптивного позиционирования элементов на странице. В основе её работы лежит алгоритм размещения, похожий на “masonry”, но с поддержкой более сложной сетки и возможности перетаскивания элементов. Адаптивные стили обеспечиваются за счёт сочетания CSS и конфигурации Packery, что позволяет автоматически перестраивать сетку при изменении размеров окна или контейнера.
Для корректной работы адаптивной сетки важно правильно настроить контейнер и элементы:
<div id="grid">
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
#grid {
width: 100%;
margin: 0 auto;
}
.grid-item {
width: 200px;
height: 150px;
margin: 10px;
background-color: #ccc;
}
Здесь ключевые моменты:
width: 100% для контейнера обеспечивает гибкость
сетки.width: 200px) может
быть заменена на процентное значение или использоваться через
медиазапросы для адаптации под разные устройства.margin обеспечивает пространство между элементами,
которое учитывается алгоритмом Packery при расстановке.Инициализация библиотеки требует передачи объекта конфигурации:
var grid = document.querySelector('#grid');
var pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10,
percentPosition: true
});
Ключевые параметры:
itemSelector — CSS-селектор для элементов сетки.gutter — расстояние между элементами.percentPosition: true — позволяет использовать проценты
для ширины элементов, что критично для адаптивной сетки.Packery хорошо сочетается с CSS-медиазапросами. Пример изменения ширины элементов в зависимости от ширины экрана:
@media (max-width: 1200px) {
.grid-item {
width: 30%;
}
}
@media (max-width: 768px) {
.grid-item {
width: 45%;
}
}
@media (max-width: 480px) {
.grid-item {
width: 100%;
}
}
Особенности:
percentPosition: true позволяет сохранять
корректное позиционирование при любом изменении размеров.Для полной адаптивности нужно уведомлять Packery об изменении размеров:
window.addEventListener('resize', function() {
pckry.layout();
});
Важно: вызов layout() после изменения
размеров гарантирует, что элементы будут корректно расставлены в новом
пространстве.
Packery поддерживает элементы с разной шириной и высотой, что часто встречается в адаптивных макетах. Для этого можно использовать классы с разными размерами:
<div class="grid-item grid-item--large"></div>
<div class="grid-item grid-item--small"></div>
.grid-item--large {
width: 400px;
height: 300px;
}
.grid-item--small {
width: 200px;
height: 150px;
}
Библиотека корректно расставляет элементы, заполняя свободное пространство и избегая пустот.
Для адаптивных интерфейсов часто требуется динамически добавлять или удалять элементы:
var newItem = document.createElement('div');
newItem.className = 'grid-item';
grid.appendChild(newItem);
pckry.appended(newItem);
pckry.layout();
Принцип работы:
appendChild добавляет элемент в DOM.pckry.appended уведомляет Packery о новом
элементе.pckry.layout пересчитывает сетку, учитывая новые
размеры.Packery может работать совместно с библиотекой Draggabilly для поддержки drag-and-drop. Это особенно полезно для адаптивных интерфейсов:
var draggableElems = grid.querySelectorAll('.grid-item');
draggableElems.forEach(function(elem) {
var draggie = new Draggabilly(elem);
pckry.bindDraggabillyEvents(draggie);
});
Преимущества:
percentPosition вместо фиксированных
пикселей для ширины.gutter через медиазапросы для более
комфортного отображения на мобильных устройствах.layout() после любых изменений размеров или
добавления элементов.Адаптивные стили в Packery обеспечивают гибкую и динамичную сетку, которая автоматически подстраивается под размеры окна и размеры элементов, позволяя создавать сложные, но при этом эстетично расположенные макеты на любой ширине экрана.