Параметр initLayout управляет
автоматическим запуском первичного размещения элементов в момент
инициализации экземпляра библиотеки Packery. По
умолчанию Packery сразу после создания объекта вычисляет позиции всех
элементов сетки и выполняет компоновку. Параметр initLayout
позволяет отключить это поведение и получить полный контроль над
моментом запуска алгоритма размещения.
Это особенно полезно в ситуациях, когда элементы контейнера ещё не полностью подготовлены: например, изображения не загружены, размеры блоков изменяются динамически или требуется предварительная обработка DOM.
По умолчанию значение initLayout установлено в
true. Это означает, что после создания
экземпляра Packery автоматически выполняется метод
layout().
var grid = new Packery('.grid', {
itemSelector: '.grid-item'
});
Последовательность действий при стандартной инициализации:
itemSelector.Всё происходит автоматически, без необходимости дополнительных вызовов методов.
Для отключения первичного размещения используется параметр:
initLayout: false
Пример:
var grid = new Packery('.grid', {
itemSelector: '.grid-item',
initLayout: false
});
В этом случае:
Фактически Packery находится в состоянии ожидания.
После отключения автоматической инициализации необходимо
самостоятельно вызвать метод layout().
grid.layout();
Полный пример:
var grid = new Packery('.grid', {
itemSelector: '.grid-item',
initLayout: false
});
// подготовка данных или загрузка ресурсов
grid.layout();
Такой подход позволяет точно определить момент, когда все элементы готовы к корректному позиционированию.
Одной из наиболее распространённых проблем при работе с сетками является изменение размеров элементов после загрузки изображений. Если layout выполнится до загрузки изображений, размеры блоков могут измениться, что приведёт к неправильной компоновке.
Использование initLayout: false позволяет сначала
дождаться загрузки всех изображений.
var grid = new Packery('.grid', {
itemSelector: '.grid-item',
initLayout: false
});
imagesLoaded('.grid', function() {
grid.layout();
});
Алгоритм работы:
imagesLoaded отслеживает загрузку всех
изображений.layout().Это гарантирует корректные размеры элементов.
При получении элементов из API или при динамической генерации DOM структура сетки может формироваться постепенно.
var grid = new Packery('.grid', {
itemSelector: '.grid-item',
initLayout: false
});
fetch('/api/items')
.then(response => response.json())
.then(data => {
renderItems(data);
grid.reloadItems();
grid.layout();
});
Последовательность:
reloadItems);Иногда требуется изменить размеры или классы элементов перед размещением.
var grid = new Packery('.grid', {
itemSelector: '.grid-item',
initLayout: false
});
var items = document.querySelectorAll('.grid-item');
items.forEach(function(item) {
if (item.dataset.size === 'large') {
item.classList.add('grid-item--large');
}
});
grid.layout();
Преимущество такого подхода заключается в том, что layout выполняется только после завершения всех модификаций.
reloadItems()Метод reloadItems() заставляет Packery заново собрать
список элементов внутри контейнера.
При использовании initLayout: false последовательность
обычно выглядит следующим образом:
grid.reloadItems();
grid.layout();
appended()Если новые элементы добавляются после первоначальной инициализации:
var newItems = document.querySelectorAll('.new-items');
grid.appended(newItems);
grid.layout();
Хотя метод appended() может сам инициировать перерасчёт,
при отключённом initLayout важно контролировать порядок
вызовов.
layout()Метод layout() является центральным механизмом запуска
алгоритма размещения.
При initLayout: false он становится обязательным
шагом.
grid.layout();
Каждый вызов:
initLayout: falselayout().Такой жизненный цикл позволяет встроить Packery в сложные сценарии инициализации.
В крупных сетках количество элементов может достигать сотен или тысяч. Автоматический запуск layout может происходить несколько раз во время начальной загрузки страницы, особенно если DOM активно изменяется.
Использование initLayout: false позволяет:
Особенно это заметно при:
| Параметр | Поведение |
|---|---|
initLayout: true |
Layout запускается автоматически |
initLayout: false |
Layout запускается вручную |
Packery генерирует события, связанные с процессом размещения. После ручного запуска layout можно отслеживать завершение компоновки.
grid.on('layoutComplete', function(items) {
console.log('Layout завершён');
});
Пример последовательности:
var grid = new Packery('.grid', {
itemSelector: '.grid-item',
initLayout: false
});
prepareGrid();
grid.layout();
После выполнения layout() будет сгенерировано событие
layoutComplete.
При наличии нескольких контейнеров Packery можно синхронизировать их инициализацию.
var grids = document.querySelectorAll('.grid');
var instances = [];
grids.forEach(function(gridElement) {
var pckry = new Packery(gridElement, {
itemSelector: '.grid-item',
initLayout: false
});
instances.push(pckry);
});
// после подготовки всех данных
instances.forEach(function(instance) {
instance.layout();
});
Это предотвращает ситуации, когда разные сетки начинают размещение в разные моменты времени.
layout()Если initLayout отключён, но layout() не
вызывается, элементы остаются в исходных позициях DOM и не получают
координат Packery.
Признаки:
layout() до подготовки элементовЕсли layout вызывается слишком рано:
grid.layout();
loadImages();
после загрузки изображений размеры блоков изменятся, что может нарушить структуру сетки.
Корректный порядок:
renderItems();
grid.reloadItems();
grid.layout();
Некорректный порядок:
grid.layout();
grid.reloadItems();
Во втором случае новые элементы не будут учтены при размещении.
initLayout: false оправданоОтключение автоматического layout применяется в следующих случаях:
При простых статических сетках использование параметра обычно не требуется, так как стандартное поведение Packery уже обеспечивает корректную компоновку.