Режим fitRows в библиотеке Isotope предназначен для построения сетки элементов, размещённых по строкам. Элементы располагаются горизонтально, слева направо, и автоматически переходят на новую строку, когда в текущей строке заканчивается доступное пространство контейнера.
Такой алгоритм компоновки напоминает поведение inline-block
элементов или flexbox со свойством
flex-wrap, но выполняется на уровне
JavaScript-логики Isotope и тесно интегрирован с механизмами фильтрации,
сортировки и анимации.
Основные особенности режима:
Этот режим используется для галерей, каталогов товаров, карточек проектов и любых сеток, где элементы должны образовывать аккуратные горизонтальные ряды.
Алгоритм fitRows последовательно размещает элементы внутри контейнера, вычисляя координаты для каждого блока.
Процесс размещения состоит из нескольких этапов:
(0, 0).Схематически расположение элементов можно представить так:
[ item ][ item ][ item ][ item ]
[ item ][ item ][ item ][ item ]
[ item ][ item ]
Каждый новый элемент проверяет доступное горизонтальное пространство.
Если:
currentX + itemWidth > containerWidth
то координаты изменяются:
currentX = 0
currentY += rowHeight
После этого элемент размещается в новой строке.
Для активации режима используется параметр layoutMode.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows'
});
Здесь:
.grid — контейнер сетки.grid-item — элементы сеткиlayoutMode определяет алгоритм размещенияHTML-структура обычно выглядит следующим образом:
<div class="grid">
<div class="grid-item">1</div>
<div class="grid-item">2</div>
<div class="grid-item">3</div>
<div class="grid-item">4</div>
</div>
CSS задаёт размеры элементов.
.grid-item {
width: 200px;
height: 150px;
}
В результате Isotope автоматически создаёт ряды из карточек.
При размещении каждого элемента Isotope вычисляет координаты:
Для первого элемента:
x = 0
y = 0
Для следующего:
x = previousX + previousWidth
y = currentRowY
Если элемент не помещается:
x = 0
y = previousRowY + rowHeight
Высота строки определяется самым высоким элементом в ряду.
Это позволяет корректно размещать элементы различной высоты.
Режим fitRows поддерживает параметр gutter, который задаёт расстояние между элементами.
Пример:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows',
fitRows: {
gutter: 20
}
});
В этом случае между элементами появляется промежуток 20px.
Схематически:
[item] 20px [item] 20px [item]
Gutter применяется:
Вместо фиксированного значения можно использовать gutter-элемент.
HTML:
<div class="grid">
<div class="gutter-sizer"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
JS:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows',
fitRows: {
gutter: '.gutter-sizer'
}
});
CSS:
.gutter-sizer {
width: 20px;
}
Такой подход удобен при адаптивных сетках.
Режим fitRows автоматически адаптируется к изменению ширины контейнера.
При уменьшении ширины браузера:
Для корректной работы используется событие resize.
Isotope выполняет пересчёт автоматически:
var iso = new Isotope('.grid', {
layoutMode: 'fitRows'
});
При необходимости можно вызвать пересчёт вручную:
iso.layout();
Одной из ключевых возможностей Isotope является динамическая фильтрация элементов.
При использовании fitRows элементы, не прошедшие фильтр, исключаются из расчётов.
Пример фильтрации:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows'
});
iso.arrange({
filter: '.category-a'
});
HTML:
<div class="grid-item category-a"></div>
<div class="grid-item category-b"></div>
<div class="grid-item category-a"></div>
После фильтрации:
fitRows полностью поддерживает систему сортировки Isotope.
Пример:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows',
getSortData: {
name: '.name',
number: '.number parseInt'
}
});
Сортировка:
iso.arrange({
sortBy: 'number'
});
После сортировки:
Isotope использует CSS-трансформации для плавного перемещения элементов.
Когда меняется:
элементы получают новые координаты и перемещаются с анимацией.
Параметры анимации:
var iso = new Isotope('.grid', {
layoutMode: 'fitRows',
transitionDuration: '0.4s'
});
Можно отключить анимацию:
transitionDuration: 0
Хотя оба режима формируют сетку, их логика принципиально различается.
fitRows
[ ][ ][ ][ ]
[ ][ ][ ][ ]
masonry
[ ] [ ]
[ ] [ ][ ]
[ ] [ ]
fitRows обеспечивает более строгую и предсказуемую сетку.
Несмотря на простоту, режим имеет ряд особенностей.
1. Отсутствие плотной упаковки
Если элементы имеют разную высоту, могут появляться пустоты в нижней части строки.
2. Нет перекомпоновки внутри строки
Элементы не перемещаются для заполнения свободных участков.
3. Одинаковая логика строк
Каждая строка строится строго последовательно.
Isotope поддерживает добавление элементов после инициализации.
HTML:
<div class="grid">
<div class="grid-item"></div>
</div>
JS:
var newItems = document.createElement('div');
newItems.className = 'grid-item';
grid.appendChild(newItems);
iso.appended(newItems);
После добавления:
Если размеры элементов изменяются динамически (например, загрузилось изображение), необходимо пересчитать layout.
iso.layout();
Часто используется вместе с библиотекой imagesLoaded:
imagesLoaded('.grid', function() {
iso.layout();
});
Это предотвращает ошибки позиционирования до загрузки изображений.
Алгоритм fitRows относительно лёгкий по вычислениям.
Сложность размещения элементов примерно:
O(n)
где n — количество элементов.
Каждый элемент обрабатывается один раз:
Это делает режим эффективным даже при сотнях элементов.
Наиболее распространённые области применения режима fitRows:
Каталоги товаров
[товар][товар][товар][товар]
[товар][товар][товар][товар]
Галереи изображений
[фото][фото][фото]
[фото][фото][фото]
Портфолио проектов
[проект][проект][проект]
[проект][проект][проект]
Карточки статей
[статья][статья][статья]
[статья][статья][статья]
fitRows часто используется вместе со следующими параметрами:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows',
percentPosition: true,
transitionDuration: '0.3s',
stagger: 30
});
Здесь:
Режим fitRows подходит, когда требуется:
Этот режим считается одним из самых простых и стабильных способов построения сеточных интерфейсов в библиотеке Isotope.