Событие layoutComplete относится к системе событий
библиотеки Masonry и сигнализирует о завершении процесса размещения
элементов внутри контейнера. Оно вызывается после того, как библиотека
полностью рассчитала позиции всех элементов сетки и применила
соответствующие стили позиционирования.
В контексте динамических интерфейсов это событие играет важную роль, поскольку многие действия должны выполняться только после окончательной компоновки элементов: обновление интерфейса, запуск анимаций, подгрузка данных или синхронизация других компонентов страницы.
layoutCompleteСобытие срабатывает после завершения метода layout. Этот
метод отвечает за вычисление координат каждого элемента и их размещение
в колонках с учётом высоты предыдущих элементов.
layoutComplete вызывается в нескольких случаях:
layout();Событие гарантирует, что:
top и
left;Masonry использует систему событий, основанную на механизме
EvEmitter. Подписка выполняется через метод
on.
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200
});
msnry.on('layoutComplete', function(items) {
console.log('Layout завершён');
});
Функция обработчика получает массив элементов, которые участвовали в последнем процессе компоновки.
Обработчик layoutComplete принимает один аргумент:
| Аргумент | Тип | Описание |
|---|---|---|
items |
Array | массив объектов элементов Masonry |
Каждый объект массива представляет собой внутреннюю структуру
Item, используемую Masonry.
Пример использования:
msnry.on('layoutComplete', function(items) {
console.log('Количество элементов:', items.length);
});
ItemКаждый объект Item содержит информацию о DOM-элементе и
его текущем положении.
Основные свойства:
| Свойство | Описание |
|---|---|
element |
DOM-элемент |
position.x |
координата по горизонтали |
position.y |
координата по вертикали |
size |
размеры элемента |
Пример доступа:
msnry.on('layoutComplete', function(items) {
items.forEach(function(item) {
console.log(item.position.x, item.position.y);
});
});
Это позволяет выполнять дополнительную логику, зависящую от координат элементов.
Внутренний цикл работы Masonry при вызове layout()
выглядит следующим образом:
layoutComplete.Таким образом, обработчик всегда получает окончательный результат компоновки.
Одной из распространённых задач является ожидание завершения layout после загрузки изображений. Поскольку высота элементов часто зависит от изображений, корректная компоновка может произойти только после их загрузки.
Для этого обычно используется библиотека imagesLoaded.
Пример:
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200
});
imagesLoaded(grid, function() {
msnry.layout();
});
msnry.on('layoutComplete', function(items) {
console.log('Layout после загрузки изображений завершён');
});
В этом сценарии layoutComplete выполняется только после
корректного вычисления размеров всех элементов.
Когда новые элементы добавляются в сетку, Masonry может
перерассчитать расположение. После этого снова вызывается
layoutComplete.
Пример:
var newItems = document.querySelectorAll('.new-item');
msnry.appended(newItems);
msnry.on('layoutComplete', function(items) {
console.log('Перерасчёт после добавления элементов завершён');
});
Последовательность операций:
layoutComplete.Событие удобно применять для синхронизации пользовательских анимаций.
Пример:
msnry.on('layoutComplete', function(items) {
items.forEach(function(item) {
item.element.classList.add('visible');
});
});
CSS:
.grid-item {
opacity: 0;
transition: opacity 0.5s;
}
.grid-item.visible {
opacity: 1;
}
Анимация начнётся только после того, как элементы займут свои позиции.
Для удаления обработчика используется метод off.
function onLayout(items) {
console.log('Layout завершён');
}
msnry.on('layoutComplete', onLayout);
msnry.off('layoutComplete', onLayout);
Это важно при создании сложных интерфейсов, где компоненты могут уничтожаться или пересоздаваться.
layoutComplete и arrangeCompleteВ библиотеке Masonry существуют похожие события, выполняющие разные функции.
| Событие | Назначение |
|---|---|
layoutComplete |
завершение расчёта позиций |
arrangeComplete |
завершение операций фильтрации и сортировки |
layoutComplete отвечает исключительно за геометрию
размещения элементов.
Если включена опция:
resize: true
Masonry автоматически пересчитывает layout при изменении размеров
окна браузера. После каждого перерасчёта снова срабатывает
layoutComplete.
Пример:
msnry.on('layoutComplete', function() {
console.log('Layout обновился после resize');
});
layoutComplete позволяет анализировать поведение сетки и
выявлять проблемы с компоновкой.
Пример:
msnry.on('layoutComplete', function(items) {
console.table(items.map(function(item) {
return {
x: item.position.x,
y: item.position.y
};
}));
});
Это позволяет быстро увидеть координаты всех элементов.
Частые срабатывания layoutComplete могут влиять на
производительность, особенно если обработчик выполняет тяжёлые
операции.
Рекомендации:
layout() внутри
layoutComplete;Пример debounce:
let timer;
msnry.on('layoutComplete', function() {
clearTimeout(timer);
timer = setTimeout(function() {
console.log('Оптимизированная обработка');
}, 100);
});
Внутри Masonry после завершения layout вызывается метод эмиттера:
this.dispatchEvent('layoutComplete', null, [items]);
Этот механизм обеспечивает:
Такой подход обеспечивает расширяемость и удобство интеграции библиотеки в сложные интерфейсы.