Masonry — это библиотека для построения сетки с динамическими колонками в JavaScript. Ключевой частью работы с Masonry является правильное указание селекторов элементов, которые будут размещены в сетке. Эти селекторы определяют, какие HTML-элементы Masonry будет обрабатывать при построении сетки, а также управляют поведением элементов при добавлении или удалении контента.
itemSelectorСвойство itemSelector задается при инициализации Masonry
и принимает строку, содержащую CSS-селектор элементов. Оно сообщает
библиотеке, какие дочерние элементы контейнера будут позиционироваться в
сетке.
Пример использования:
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
В данном примере:
.grid — контейнер сетки;.grid-item — селектор элементов, которые Masonry будет
расставлять;columnWidth — ширина колонок;gutter — отступ между элементами.Важно: все элементы, соответствующие селектору, должны быть непосредственно потомками контейнера. Если элементы вложены глубже, Masonry их игнорирует.
Masonry поддерживает выбор элементов с помощью сложных CSS-селекторов. Например, можно комбинировать классы и теги:
const msnry = new Masonry('.grid', {
itemSelector: '.grid-item, .highlighted-item'
});
В этом случае Masonry будет обрабатывать элементы с классом
.grid-item и .highlighted-item. Это полезно,
когда сетка должна содержать элементы разных типов с единым
позиционированием.
Для добавления элементов после инициализации Masonry используется
метод appended. Метод принимает NodeList или массив
элементов, соответствующих itemSelector, и обновляет
сетку с учётом новых элементов:
const newItems = document.querySelectorAll('.grid-item.new');
msnry.appended(newItems);
Ключевой момент: все добавленные элементы должны соответствовать селектору, иначе они не будут обработаны Masonry.
Хотя Masonry напрямую не фильтрует элементы, правильный выбор itemSelector позволяет исключить из сетки ненужные элементы. Например, если внутри контейнера есть вспомогательные блоки:
<div class="grid">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="ad-banner">Реклама</div>
</div>
Настройка:
const msnry = new Masonry('.grid', {
itemSelector: '.grid-item'
});
Элемент .ad-banner игнорируется, так как он не
соответствует селектору .grid-item.
При изменении содержимого элементов или их размеров важно
использовать метод layout для перерасчёта сетки. Masonry не
изменяет элементы вне itemSelector, поэтому изменения
других элементов не влияют на расположение сетки:
const updatedItems = document.querySelectorAll('.grid-item.updated');
msnry.layout();
Это гарантирует, что Masonry корректно перестроит сетку с учетом текущих размеров элементов, выбранных через itemSelector.
div или
*, чтобы повысить производительность.appended,
prepended или layout, чтобы новые или
изменённые элементы корректно интегрировались в сетку..grid-item, .special-item[data-grid-item].grid > .grid-itemПравильная работа с селекторами обеспечивает эффективное управление Masonry-сеткой, точное позиционирование элементов и упрощает динамическое добавление контента.