Для работы с Masonry необходимо подключить библиотеку к проекту. Обычно это делается через CDN или через пакетный менеджер npm/yarn:
<script src="https://unpkg.com/masonry-layout@4/dist/masonry.pkgd.min.js"></script>
Инициализация происходит на контейнере с элементами, которые должны быть расположены по сетке:
var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
Ключевые параметры:
itemSelector — CSS-селектор для элементов сетки.columnWidth — ширина колонки, может быть фиксированной
или определяться элементом-сайзером.percentPosition — если true, Masonry
использует процентные значения ширины колонок.prependedМетод prepended используется для добавления новых
элементов в начало сетки, не нарушая текущую раскладку. В отличие от
appended, новые элементы вставляются сверху, смещая
существующие вниз.
Синтаксис:
msnry.prepended(newElements);
newElements — одиночный элемент или коллекция элементов
(NodeList, массив или jQuery-объект).prepended Masonry автоматически
пересчитывает позиции всех элементов, включая новые.Новые элементы обычно создаются динамически и сразу добавляются в DOM. Пример с использованием чистого Jav * aScript:
var grid = document.querySelector('.grid');
// Создание нового элемента
var item = document.createElement('div');
item.className = 'grid-item';
item.textContent = 'Новый элемент';
// Вставка в DOM перед первым элементом
grid.insertBefore(item, grid.firstChild);
// Обновление Masonry
msnry.prepended(item);
Если необходимо добавить несколько элементов одновременно:
var newItems = [];
for (var i = 0; i < 5; i++) {
var item = document.createElement('div');
item.className = 'grid-item';
item.textContent = 'Элемент ' + (i + 1);
grid.insertBefore(item, grid.firstChild);
newItems.push(item);
}
msnry.prepended(newItems);
При работе с изображениями важно дождаться их полной загрузки, чтобы
Masonry корректно рассчитал позиции. Для этого используется библиотека
imagesLoaded:
<script src="https://unpkg.com/imagesloaded@4/imagesloaded.pkgd.min.js"></script>
Пример интеграции:
imagesLoaded(grid, function() {
var newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.innerHTML = '<img src="image.jpg">';
grid.insertBefore(newItem, grid.firstChild);
msnry.prepended(newItem);
});
Это гарантирует, что сетка не сломается из-за не загруженных изображений.
После добавления элементов с prepended Masonry
автоматически обновляет сетку. Дополнительно можно вызвать методы:
msnry.layout() — пересчитывает позиции всех
элементов.msnry.reloadItems() — пересчитывает список элементов,
полезно при динамическом изменении DOM.Пример комбинирования:
msnry.prepended(newItem);
msnry.layout();
documentFragment:
позволяет вставлять элементы в DOM единожды, а не по отдельности.Пример с documentFragment:
var fragment = document.createDocumentFragment();
for (var i = 0; i < 10; i++) {
var item = document.createElement('div');
item.className = 'grid-item';
item.textContent = 'Элемент ' + (i + 1);
fragment.appendChild(item);
}
grid.insertBefore(fragment, grid.firstChild);
msnry.prepended(fragment.children);
Если проект использует jQuery, работа с prepended
упрощается:
var $grid = $('.grid').masonry({
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
var $newItem = $('<div class="grid-item">Новый элемент</div>');
$grid.prepend($newItem).masonry('prepended', $newItem);
jQuery позволяет легко создавать и вставлять новые элементы, сохраняя совместимость с Masonry.
Для плавного появления элементов рекомендуется использовать CSS-анимации с классами:
.grid-item {
opacity: 0;
transform: translateY(-20px);
transition: all 0.3s ease;
}
.grid-item.msnry-added {
opacity: 1;
transform: translateY(0);
}
И JavaScript для добавления класса после вставки:
msnry.prepended(newItem);
newItem.classList.add('msnry-added');
Это создаёт эффект “выдвигающихся сверху” элементов при добавлении.
prependedimagesLoaded.documentFragment.Метод prepended — основной инструмент для динамического
расширения Masonry сверху, обеспечивая корректное расположение элементов
и сохранение визуальной структуры сетки.