Библиотека Masonry обеспечивает динамическое расположение элементов в сетке с учетом их размеров. Стандартное поведение подразумевает добавление элементов в конец контейнера, после чего Masonry автоматически перестраивает сетку. Для вставки элемента в произвольную позицию необходимо контролировать порядок DOM-элементов и корректно уведомлять Masonry о внесенных изменениях.
append и
prependappend добавляет элементы в конец контейнера и
инициирует перерасчет сетки.prepend вставляет элементы в начало контейнера.Пример:
let grid = document.querySelector('.grid');
let msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
let newItem = document.createElement('div');
newItem.classList.add('grid-item');
newItem.textContent = 'Новый элемент';
// Вставка в начало
msnry.prepend(newItem);
Эти методы удобны для простого добавления в начало или конец, но не подходят для произвольной позиции.
Чтобы вставить элемент в произвольную позицию:
insertBefore или
insertAdjacentElement.msnry.prepended() или
msnry.appended(), в зависимости от того, как Masonry
воспринимает элемент.Пример вставки в середину:
let container = document.querySelector('.grid');
let newItem = document.createElement('div');
newItem.classList.add('grid-item');
newItem.textContent = 'Элемент в середине';
// Вставка перед третьим элементом (индекс 2)
container.insertBefore(newItem, container.children[2]);
// Обновление Masonry
msnry.appended(newItem);
Важно: даже при вставке в середину Masonry воспринимает элемент как
“новый”, поэтому метод appended инициирует перерасчет сетки
корректно.
Если требуется вставить несколько элементов в разные позиции одновременно, удобно создавать массив элементов и распределять их по DOM:
let items = [];
for (let i = 0; i < 5; i++) {
let item = document.createElement('div');
item.classList.add('grid-item');
item.textContent = `Элемент ${i+1}`;
items.push(item);
}
// Вставка перед пятым элементом
container.insertBefore(items[0], container.children[4]);
container.insertBefore(items[1], container.children[1]);
// Обновление Masonry
msnry.appended(items);
После вставки элементов в произвольные позиции часто требуется принудительная перекомпоновка сетки для корректного расположения всех элементов:
msnry.layout();
Метод layout() перерасчитывает позиции всех элементов,
что особенно важно при динамическом изменении размеров элементов или
контейнера.
Masonry поддерживает CSS-анимации при добавлении новых элементов. Для этого:
Пример CSS:
.grid-item {
transition: transform 0.3s, opacity 0.3s;
opacity: 0;
}
.grid-item.is-visible {
opacity: 1;
}
Пример Jav * aScript:
newItem.classList.add('grid-item');
container.insertBefore(newItem, container.children[2]);
msnry.appended(newItem);
// Запуск анимации через небольшую задержку
requestAnimationFrame(() => {
newItem.classList.add('is-visible');
});
appended/prepended) приведет к наложению
элементов и некорректной сетке.insertBefore позволяет абсолютно точно указать
позицию, но требует учета текущих элементов, так как Masonry
ориентируется на порядок DOM.layout() после вставки нескольких элементов, чтобы избежать
смещений.Использование этих подходов обеспечивает точное позиционирование элементов в Masonry с сохранением гибкости и анимаций сетки.