Packery — это библиотека для создания динамических сеток с «вложением» элементов, где каждый блок может занимать произвольное место, а библиотека автоматически располагает их оптимальным образом. Управление видимостью элементов в таких сетках требует понимания как работы самой сетки, так и методов DOM для отображения и скрытия блоков.
Чтобы скрыть элемент, необходимо не только изменить его CSS-свойство
display или visibility, но и уведомить Packery
о том, что элемент больше не участвует в раскладке.
Пример:
var grid = document.querySelector('.grid');
var pckry = new Packery(grid, {
itemSelector: '.grid-item',
gutter: 10
});
var item = document.querySelector('.grid-item.hidden');
// Скрытие элемента
item.style.display = 'none';
// Удаление элемента из раскладки Packery
pckry.remove(item);
// Перестройка сетки после удаления
pckry.layout();
Ключевые моменты:
display: none полностью убирает элемент из
DOM-визуализации. Packery при этом не видит элемент, пока его не
добавить обратно.remove() удаляет элемент из внутренних данных
Packery, чтобы при последующей перестройке сетки он не учитывался.layout() гарантирует перерасчет положения оставшихся
элементов.Если элемент был скрыт и удалён из сетки, чтобы вернуть его обратно, необходимо добавить его снова и обновить раскладку.
Пример:
// Отображение элемента
item.style.display = 'block';
// Добавление в сетку Packery
pckry.appended(item);
// Перестройка сетки
pckry.layout();
Особенности:
appended() уведомляет Packery о новых элементах в
DOM, которые нужно учесть в раскладке.layout() пересчитывает позиции всех элементов, чтобы
сетка оставалась оптимальной.Packery не управляет анимацией по умолчанию, поэтому для плавного скрытия или появления элементов используют CSS-переходы и события JavaScript.
Пример с переходами:
.grid-item {
transition: transform 0.4s, opacity 0.4s;
opacity: 1;
}
.grid-item.hidden {
opacity: 0;
transform: scale(0.5);
}
// Плавное скрытие
item.classList.add('hidden');
setTimeout(function() {
item.style.display = 'none';
pckry.remove(item);
pckry.layout();
}, 400);
// Плавное появление
item.style.display = 'block';
setTimeout(function() {
item.classList.remove('hidden');
pckry.appended(item);
pckry.layout();
}, 50);
Важно:
hidden управляет визуальными свойствами, а
display: none управляет участием в раскладке.Для реализации фильтров (например, по категориям) скрытые элементы можно временно удалять и добавлять в сетку.
Пример фильтрации:
function filterItems(category) {
var items = grid.querySelectorAll('.grid-item');
items.forEach(function(item) {
if (!item.classList.contains(category)) {
item.style.display = 'none';
pckry.remove(item);
} else {
item.style.display = 'block';
pckry.appended(item);
}
});
pckry.layout();
}
Примечания:
remove() и
appended() с динамическим управлением CSS.layout(),
иначе сетка будет отображать пустые пространства.Для ускорения работы с большим количеством элементов можно использовать массивы и методы Packery для работы с множественными элементами одновременно.
var hiddenItems = grid.querySelectorAll('.grid-item.hidden');
pckry.remove(hiddenItems);
pckry.layout();
var visibleItems = grid.querySelectorAll('.grid-item.visible');
pckry.appended(visibleItems);
pckry.layout();
Особенности производительности:
remove() или appended(), чем по
отдельности.showItem(item) и
hideItem(item) для централизованного управления
видимостью.innerHTML контейнера сетки,
чтобы не разрушить текущую структуру Packery.Эта методика позволяет создавать динамические, фильтруемые и анимированные сетки с Packery, где показ и скрытие элементов происходит плавно и без визуальных сбоев.