Masonry — это библиотека JavaScript, реализующая «каскадную» сетку, где элементы располагаются оптимально по высоте колонок. В стандартной работе Masonry новые элементы добавляются в конец контейнера. Для вставки элементов в начало сетки требуется учитывать как DOM, так и внутренние методы Masonry.
prepend()Masonry предоставляет метод prepend() для добавления
элементов в начало контейнера. Этот метод корректно обновляет позиции
всех элементов и выполняет анимацию появления нового контента.
Синтаксис:
masonryInstance.prepend(items);
items — один элемент DOM или коллекция элементов.Пример использования:
const grid = document.querySelector('.grid');
const masonry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
const newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.textContent = 'Новый элемент в начале';
masonry.prepend(newItem);
После вызова prepend Masonry перерасчитывает позиции
всех элементов с анимацией, если она включена в настройках.
Для корректной работы Masonry важно, чтобы новые элементы
сначала добавлялись в DOM, а уже затем Masonry
рассчитывал их расположение. Прямое использование prepend()
без добавления в DOM приведет к некорректной отрисовке.
Правильная последовательность действий:
const newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.textContent = 'Элемент сверху';
grid.insertBefore(newItem, grid.firstChild);
masonry.prepended(newItem);
masonry.layout();
Метод
prepended()сообщает Masonry, что элемент был вставлен вручную и его нужно учесть при расстановке.
Если требуется добавить несколько элементов в начало, можно использовать массив или коллекцию NodeList:
const items = [];
for (let i = 0; i < 3; i++) {
const item = document.createElement('div');
item.className = 'grid-item';
item.textContent = `Элемент ${i + 1}`;
grid.insertBefore(item, grid.firstChild);
items.push(item);
}
masonry.prepended(items);
masonry.layout();
Ключевой момент: массив элементов должен содержать все новые DOM-элементы, уже вставленные в контейнер, иначе Masonry не сможет корректно рассчитать позиции.
Masonry поддерживает анимацию при добавлении новых элементов. Для
этого достаточно задать CSS-переходы для transform и
opacity:
.grid-item {
transition: transform 0.4s, opacity 0.4s;
}
При вызове prepended() элементы плавно «появляются» на
верхних позициях сетки, а остальные элементы смещаются.
DocumentFragment, чтобы снизить
количество операций с DOM.const fragment = document.createDocumentFragment();
for (let i = 0; i < 10; i++) {
const item = document.createElement('div');
item.className = 'grid-item';
item.textContent = `Элемент ${i + 1}`;
fragment.appendChild(item);
}
grid.insertBefore(fragment, grid.firstChild);
masonry.prepended(Array.from(fragment.children));
masonry.layout();
layout() для каждого элемента; лучше собрать все новые
элементы и вызвать метод один раз.prepended() остается
той же: сначала DOM, затем Masonry.append и prependMasonry поддерживает одновременное использование методов:
append() — добавление в конец сетки.prepend() / prepended() — добавление в
начало.Важно различать:
prepend() — метод для вставки новых
элементов через Masonry, автоматически добавляет их в DOM.prepended() — уведомление Masonry о
уже вставленных вручную элементах.