Режим masonryHorizontal — один из
вариантов раскладки элементов в библиотеке Isotope,
предназначенный для построения горизонтальной «каменной кладки». В
отличие от классического режима masonry,
который заполняет вертикальные колонки сверху вниз, данный алгоритм
выстраивает элементы в горизонтальные строки слева
направо, автоматически распределяя их по рядам с различной
высотой.
Основная задача режима — эффективное использование горизонтального пространства, особенно в интерфейсах, где ширина контейнера значительно превышает его высоту.
Алгоритм работает следующим образом:
В результате формируется динамическая горизонтальная сетка, напоминающая «кирпичную кладку», но повернутую на 90 градусов.
| Свойство | masonry | masonryHorizontal |
|---|---|---|
| Направление заполнения | сверху вниз | слева направо |
| Основная ось | вертикальная | горизонтальная |
| Формирование колонок | да | нет |
| Формирование строк | нет | да |
masonry создаёт колонки разной
высоты.
masonryHorizontal создаёт строки разной
ширины.
| Свойство | fitRows | masonryHorizontal |
|---|---|---|
| Высота строк | одинаковая | может отличаться |
| Асимметрия | нет | есть |
| Уплотнение элементов | среднее | максимальное |
Алгоритм fitRows работает как обычная
сетка. masonryHorizontal распределяет
элементы плотнее, поскольку не привязан к фиксированной высоте
строки.
Алгоритм размещения элементов включает несколько этапов.
Контейнер разбивается на виртуальные строки одинаковой высоты, определяемой параметром:
rowHeight
Если параметр не задан, Isotope вычисляет его автоматически.
Для каждой строки хранится текущее значение:
occupiedWidth
Это суммарная ширина элементов, уже размещённых в строке.
Каждый новый элемент помещается:
в строку с минимальной текущей шириной
Псевдологика алгоритма:
найти строку с минимальной occupiedWidth
разместить элемент в этой строке
увеличить occupiedWidth строки
Это обеспечивает равномерное распределение элементов.
После выбора строки рассчитываются координаты:
x = текущая ширина строки
y = индекс строки * высота строки
Элемент получает позицию через CSS:
transform: translate(x, y)
Минимальная конфигурация Isotope:
var iso = new Isotope('.grid', {
layoutMode: 'masonryHorizontal',
itemSelector: '.grid-item'
});
HTML структура:
<div class="grid">
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
CSS контейнера:
.grid {
height: 300px;
}
Высота контейнера обязательна, поскольку именно она определяет количество строк.
Все параметры передаются через объект:
masonryHorizontal
Пример конфигурации:
var iso = new Isotope('.grid', {
layoutMode: 'masonryHorizontal',
masonryHorizontal: {
rowHeight: 100,
gutter: 10
}
});
Определяет высоту одной строки сетки.
rowHeight: 120
Контейнер высотой 360px создаст:
360 / 120 = 3 строки
Можно использовать элемент-шаблон:
rowHeight: '.grid-sizer'
HTML:
<div class="grid">
<div class="grid-sizer"></div>
<div class="grid-item"></div>
</div>
CSS:
.grid-sizer {
height: 120px;
}
Этот подход облегчает адаптивную настройку сетки.
Определяет отступ между элементами.
masonryHorizontal: {
gutter: 10
}
Отступ применяется:
masonryHorizontal: {
gutter: '.gutter-sizer'
}
HTML:
<div class="gutter-sizer"></div>
CSS:
.gutter-sizer {
height: 10px;
}
Режим раскрывается полностью при использовании элементов разной ширины.
CSS пример:
.grid-item {
height: 100px;
}
.grid-item.wide {
width: 300px;
}
.grid-item.medium {
width: 200px;
}
.grid-item.small {
width: 120px;
}
HTML:
<div class="grid-item small"></div>
<div class="grid-item medium"></div>
<div class="grid-item wide"></div>
Алгоритм распределит элементы так, чтобы строки оставались максимально заполненными.
Количество строк зависит от:
containerHeight / rowHeight
Например:
containerHeight = 400px
rowHeight = 100px
Получаем:
4 строки
Если высота контейнера изменяется, требуется пересчёт layout.
После изменения размеров контейнера выполняется:
iso.layout();
Или:
iso.arrange();
Это пересчитывает координаты всех элементов.
При изменении ширины окна рекомендуется вызывать пересчёт:
window.addEventListener('resize', function() {
iso.layout();
});
Часто используется debounce для уменьшения количества вызовов.
masonryHorizontal полностью поддерживает систему
фильтров.
Инициализация:
var iso = new Isotope('.grid', {
layoutMode: 'masonryHorizontal',
itemSelector: '.grid-item'
});
Фильтр:
iso.arrange({
filter: '.category-photo'
});
После фильтрации сетка перестраивается автоматически.
Элементы могут быть отсортированы:
iso.arrange({
sortBy: 'name'
});
или
iso.arrange({
sortBy: 'original-order'
});
После сортировки алгоритм заново распределяет элементы по строкам.
При большом количестве элементов рекомендуется:
Меньшее число строк ускоряет вычисления.
rowHeight → больше
Isotope применяет:
transform: translate()
вместо
top / left
Это обеспечивает:
При динамическом добавлении элементов:
requestAnimationFrame(function(){
iso.appended(newItems);
});
Это предотвращает множественные перерасчёты.
Добавление новых элементов выполняется так:
var newItems = document.querySelectorAll('.new-items');
iso.appended(newItems);
После добавления элементы автоматически размещаются в строках.
Удаление:
iso.remove(items);
iso.layout();
Сетка перестраивается без удалённых элементов.
Isotope автоматически анимирует:
Скорость задаётся параметром:
transitionDuration: '0.4s'
Широкие изображения естественно занимают больше пространства, формируя динамическую горизонтальную ленту.
Карточки различной ширины:
формируют плотную горизонтальную сетку.
Работы различного формата удобно распределяются по строкам, создавая визуально разнообразную композицию.
Без высоты контейнера Isotope не сможет определить число строк.
Неверно:
.grid {
}
Правильно:
.grid {
height: 400px;
}
Если элементы выше строки, возникает наложение.
Правильный подход:
itemHeight ≤ rowHeight
Маленькие строки создают слишком много рядов, что ухудшает производительность.
masonryHorizontal реализован как расширение базового
алгоритма Masonry.
Основные структуры:
rows[]
Каждый элемент массива содержит:
{
width: number
}
Это текущая занятая ширина строки.
Этот подход обеспечивает равномерное заполнение пространства.
Режим полностью совместим с:
Все механизмы библиотеки продолжают работать без ограничений.
Режим оптимален в следующих ситуациях:
Главное преимущество — плотная и адаптивная горизонтальная компоновка элементов, обеспечивающая эффективное использование пространства и выразительный визуальный результат.