Библиотека Isotope предоставляет гибкую систему размещения элементов внутри контейнера. Одним из ключевых аспектов работы является выбор алгоритма компоновки — layout mode. От него зависит направление распределения элементов, их позиционирование и реакция на изменение размеров контейнера.
Макеты в Isotope можно условно разделить на две большие группы:
Каждый тип определяет направление заполнения контейнера, порядок размещения элементов и характер перерасчета координат при фильтрации, сортировке или динамическом добавлении элементов.
Понимание различий между этими двумя типами позволяет правильно проектировать интерфейсы: галереи, сетки товаров, карточные списки и сложные адаптивные ленты контента.
Алгоритм расположения элементов задается через параметр layoutMode при инициализации Isotope.
var iso = new Isotope('.grid', {
layoutMode: 'masonry'
});
Значение свойства определяет, каким образом элементы будут размещаться:
| layoutMode | Описание |
|---|---|
| masonry | вертикальная кладка |
| fitRows | строки фиксированной высоты |
| vertical | строго вертикальная лента |
| masonryHorizontal | горизонтальная кладка |
| fitColumns | колоночный горизонтальный макет |
| horizontal | горизонтальная последовательность |
Первые три режима относятся к вертикальным макетам, вторые три — к горизонтальным.
Вертикальные макеты являются наиболее распространёнными. Контейнер растёт по вертикали, а элементы распределяются сверху вниз.
Вертикальные макеты используются в:
Алгоритм masonry имитирует укладку кирпичей. Элементы располагаются в колонках, заполняя минимально доступное пространство.
Это позволяет эффективно размещать элементы разной высоты.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry'
});
var iso = new Isotope('.grid', {
layoutMode: 'masonry',
masonry: {
columnWidth: 200,
gutter: 10
}
});
Параметры:
| параметр | назначение |
|---|---|
| columnWidth | ширина колонок |
| gutter | расстояние между элементами |
Часто колонка задаётся через элемент-разметку.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
masonry: {
columnWidth: '.grid-sizer',
gutter: '.gutter-sizer'
}
});
HTML:
<div class="grid">
<div class="grid-sizer"></div>
<div class="gutter-sizer"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
Это позволяет адаптировать сетку под responsive-дизайн.
Алгоритм fitRows размещает элементы строго
по строкам, подобно flex-wrap.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows'
});
Этот режим подходит для:
Преимущества:
Недостаток:
Режим vertical формирует одну колонку элементов, расположенных строго друг под другом.
Элементы получают координаты:
x = 0
y = сумма высот предыдущих элементов
var iso = new Isotope('.list', {
itemSelector: '.list-item',
layoutMode: 'vertical'
});
var iso = new Isotope('.list', {
layoutMode: 'vertical',
vertical: {
horizontalAlignment: 0.5
}
});
Параметр horizontalAlignment задаёт горизонтальное выравнивание.
| значение | результат |
|---|---|
| 0 | слева |
| 0.5 | по центру |
| 1 | справа |
Горизонтальные макеты работают противоположным образом: контейнер растёт по горизонтали, а элементы размещаются слева направо.
Основное применение:
Для корректной работы обычно требуется горизонтальная прокрутка.
Алгоритм masonryHorizontal является зеркальной версией обычного masonry.
var iso = new Isotope('.grid', {
layoutMode: 'masonryHorizontal',
itemSelector: '.grid-item'
});
var iso = new Isotope('.grid', {
layoutMode: 'masonryHorizontal',
masonryHorizontal: {
rowHeight: 150,
gutter: 10
}
});
Параметры:
| параметр | назначение |
|---|---|
| rowHeight | высота строки |
| gutter | расстояние между элементами |
Алгоритм fitColumns аналогичен fitRows, но работает в горизонтальном направлении.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitColumns'
});
Режим horizontal создаёт простую горизонтальную последовательность элементов.
Каждый элемент получает координаты:
x = сумма ширин предыдущих элементов
y = 0
var iso = new Isotope('.row', {
itemSelector: '.row-item',
layoutMode: 'horizontal'
});
Такой режим подходит для:
Контейнер автоматически расширяется вправо по мере добавления элементов.
| Характеристика | Вертикальные | Горизонтальные |
|---|---|---|
| направление роста контейнера | вниз | вправо |
| тип прокрутки | вертикальная | горизонтальная |
| основной сценарий | страницы и сетки | галереи и карусели |
| популярные режимы | masonry, fitRows | masonryHorizontal, fitColumns |
Isotope позволяет динамически менять layoutMode.
iso.arrange({
layoutMode: 'masonryHorizontal'
});
Можно реализовать переключатель вида сетки.
document.querySelector('#switch').addEventListener('click', function() {
iso.arrange({
layoutMode: 'fitColumns'
});
});
Это полезно для интерфейсов, где пользователь выбирает:
В Isotope координаты элементов вычисляются на основе:
После изменения размеров требуется пересчёт макета.
iso.layout();
Если элементы подгружаются асинхронно (например изображения), используется:
imagesLoaded('.grid', function() {
iso.layout();
});
Вертикальные и горизонтальные режимы различаются по вычислительной сложности.
Причина — необходимость вычисления оптимального размещения.
Любой макет работает вместе с фильтрацией.
iso.arrange({
filter: '.category-a'
});
При этом Isotope:
В вертикальных макетах элементы «поднимаются вверх», в горизонтальных — «сдвигаются влево».
Для корректной работы горизонтальной компоновки контейнер часто требует особых CSS-правил.
.grid {
height: 600px;
}
Контейнер должен иметь фиксированную высоту, чтобы элементы могли формировать колонки.
Для горизонтальной прокрутки:
.wrapper {
overflow-x: auto;
}
HTML:
<div class="controls">
<button data-layout="masonry">Grid</button>
<button data-layout="fitRows">Rows</button>
<button data-layout="fitColumns">Columns</button>
</div>
<div class="grid">
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
Jav * aScript:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry'
});
document.querySelectorAll('.controls button').forEach(function(btn) {
btn.addEventListener('click', function() {
var mode = btn.dataset.layout;
iso.arrange({
layoutMode: mode
});
});
});
Такая структура позволяет динамически переключать вертикальные и горизонтальные режимы размещения элементов, сохраняя фильтрацию, сортировку и анимации библиотеки Isotope.