Библиотека Masonry для JavaScript предоставляет гибкий способ расположения элементов в сетке с учетом их размеров. Element sizing — это ключевой аспект, определяющий, как Masonry распределяет элементы и управляет их позиционированием. В Masonry размеры элементов можно контролировать несколькими способами: через CSS, через JavaScript и через свойства самой библиотеки.
Masonry ориентируется на ширину контейнера и размеры его дочерних элементов. Контейнер должен иметь заданную ширину, чтобы Masonry мог рассчитать количество колонок. Элементы внутри контейнера могут иметь фиксированные или динамические размеры.
Пример базовой структуры HTML:
<div class="grid">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
</div>
CSS для элементов с фиксированной шириной:
.grid {
width: 100%;
}
.grid-item {
width: 200px;
margin-bottom: 10px;
}
В этом случае Masonry автоматически выстроит элементы в колонки, учитывая их ширину и отступы.
columnWidthСвойство columnWidth в Masonry позволяет задать базовую
ширину колонки, что влияет на распределение элементов. Значение может
быть числом (в пикселях) или селектором элемента, размеры которого будут
использоваться как эталон.
const grid = document.querySelector('.grid');
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: 200,
gutter: 10
});
Особенности:
columnWidth числом — задает фиксированную ширину всех
колонок.columnWidth селектором — Masonry будет использовать
первый элемент с указанным селектором как эталон размера колонки.gutter определяет расстояние между колонками.Использование columnWidth важно для адаптивной
сетки, когда размеры элементов могут изменяться в зависимости
от ширины контейнера.
Иногда элементы сетки могут меняться в размере после загрузки
страницы (например, при подгрузке изображений или при изменении текста).
Masonry предоставляет метод layout() для перерасчета
позиции элементов:
imagesLoaded(grid, function() {
msnry.layout();
});
imagesLoaded — отдельная библиотека, которая позволяет
дождаться полной загрузки изображений, чтобы Masonry корректно рассчитал
размеры элементов. Без этого перерасчета сетка может нарушиться.
percentPositionЕсли элементы имеют процентную ширину, необходимо
включить опцию percentPosition, чтобы Masonry корректно
учитывал размеры:
const msnry = new Masonry(grid, {
itemSelector: '.grid-item',
columnWidth: '.grid-sizer',
percentPosition: true
});
CSS:
.grid-sizer, .grid-item {
width: 25%;
}
В этом случае Masonry будет использовать .grid-sizer как
эталон для ширины колонок и корректно позиционировать элементы при
изменении ширины контейнера.
Высота элементов Masonry учитывает реальные размеры контента. В отличие от фиксированной сетки, Masonry не обрезает элементы по высоте, а строит колонки с учетом полного размера каждого блока. Для элементов с динамическим контентом важно, чтобы Masonry пересчитывал позиции после изменения высоты:
msnry.layout(); // Перерасчет сетки после изменения контента
Для плавного анимационного изменения размеров можно использовать CSS-переходы:
.grid-item {
transition: all 0.3s ease;
}
Часто для адаптивных сеток используется пустой элемент-сайзер, который задает базовую ширину колонок. Его обычно добавляют первым внутри контейнера:
<div class="grid">
<div class="grid-sizer"></div>
<div class="grid-item">1</div>
<div class="grid-item">2</div>
</div>
CSS:
.grid-sizer {
width: 20%;
}
.grid-item {
width: 20%;
}
Masonry при этом будет использовать .grid-sizer для
расчета колонок, что особенно удобно для сеток с переменной шириной
контейнера.
msnry.layout()
после изменения размеров.percentPosition: true.transition,
чтобы изменение размеров выглядело аккуратно.Эти подходы обеспечивают корректное позиционирование элементов и стабильную работу Masonry независимо от типа контента и размера экрана.