cellsByRow — режим компоновки элементов
в библиотеке Isotope, предназначенный для размещения
элементов по строкам с фиксированным количеством ячеек. Контейнер
разбивается на сетку, где каждая строка содержит определённое число
элементов, а элементы выстраиваются строго слева
направо.
Главная особенность режима заключается в том, что позиция элемента определяется номером строки и номером столбца, а не размерами соседних элементов. Все ячейки сетки имеют одинаковые размеры.
Этот режим напоминает классическую таблицу:
Подобная схема удобна для галерей, каталогов, карточек товаров, портфолио, где требуется равномерная сетка.
В режиме cellsByRow контейнер делится на строки и
столбцы. Количество столбцов определяется параметром:
columnWidth — ширина одной ячейки.
Высота строки задаётся параметром:
rowHeight.
Алгоритм размещения элементов:
x = columnIndex * columnWidth
y = rowIndex * rowHeight
Где:
columnIndex — номер столбцаrowIndex — номер строкиТаким образом формируется строгая сетка.
Использование cellsByRow выполняется через параметр
layoutMode.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'cellsByRow'
});
Контейнер .grid становится областью, в которой элементы
.grid-item располагаются по строкам.
Контейнер должен содержать элементы одинакового типа.
<div class="grid">
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
Каждый элемент будет автоматически помещён в ячейку сетки.
Размер ячеек задаётся через объект cellsByRow.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'cellsByRow',
cellsByRow: {
columnWidth: 120,
rowHeight: 120
}
});
В этом примере:
Все элементы будут выровнены по сетке 120×120.
Количество столбцов зависит от ширины контейнера.
Формула:
columns = containerWidth / columnWidth
Например:
| Ширина контейнера | columnWidth | Количество столбцов |
|---|---|---|
| 1200px | 200px | 6 |
| 960px | 200px | 4 |
| 600px | 200px | 3 |
Это делает сетку адаптивной при изменении размеров контейнера.
Размеры элементов можно задавать в CSS.
.grid-item {
width: 120px;
height: 120px;
}
Однако для cellsByRow важнее параметры
columnWidth и rowHeight, так как
именно они определяют координаты размещения.
Если размеры CSS отличаются от настроек layout-режима, возможны:
Поэтому рекомендуется синхронизировать размеры CSS и настроек Isotope.
Вместо фиксированного значения можно использовать селектор.
cellsByRow: {
columnWidth: '.grid-sizer',
rowHeight: '.grid-sizer'
}
HTML:
<div class="grid">
<div class="grid-sizer"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
CSS:
.grid-sizer {
width: 150px;
height: 150px;
}
Isotope будет считывать размеры из элемента
.grid-sizer.
Преимущества метода:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'cellsByRow',
cellsByRow: {
columnWidth: 150,
rowHeight: 150
}
});
CSS:
.grid {
width: 900px;
}
.grid-item {
width: 150px;
height: 150px;
}
При ширине контейнера 900px будет:
900 / 150 = 6 колонок
Размещение элементов:
1 2 3 4 5 6
7 8 9 10 11 12
13 14 15 ...
Для расстояния между элементами используется CSS.
.grid-item {
margin: 10px;
}
Однако необходимо учитывать, что Isotope рассчитывает позиции без учёта margin.
Поэтому рекомендуется использовать:
columnWidth = ширина + margin
rowHeight = высота + margin
Например:
width = 140px
margin = 10px
columnWidth = 160px
После изменения размеров контейнера или элементов необходимо вызвать перерасчёт.
iso.layout();
Это заставляет Isotope заново вычислить координаты элементов.
Для адаптивных интерфейсов используется процентная ширина.
CSS:
.grid-item {
width: 20%;
}
Jav * aScript:
cellsByRow: {
columnWidth: '.grid-item',
rowHeight: 200
}
Isotope будет вычислять ширину столбца по первому элементу.
cellsByRow полностью совместим с системой фильтров
Isotope.
Пример фильтра:
iso.arrange({
filter: '.category-a'
});
После фильтрации:
Например:
До фильтрации:
A B C D
E F G H
После фильтрации категории A:
A C
E G
Сетка автоматически пересобирается.
Режим поддерживает сортировку.
iso.arrange({
sortBy: 'name'
});
После сортировки элементы снова распределяются по строкам:
A B C D
E F G H
Позиции пересчитываются автоматически.
Новые элементы можно добавлять после инициализации.
var items = document.querySelectorAll('.new-items');
iso.appended(items);
После добавления Isotope:
Удаление происходит через метод remove.
iso.remove(element);
iso.layout();
После удаления:
| Режим | Принцип |
|---|---|
| masonry | элементы размещаются в свободные вертикальные области |
| fitRows | элементы заполняют строки с учётом ширины |
| cellsByRow | строгая сетка одинаковых ячеек |
| cellsByColumn | заполнение по колонкам |
Особенности cellsByRow:
Режим подходит для:
Главное условие — одинаковый размер карточек.
cellsByRow имеет ряд ограничений.
1. Все элементы должны иметь одинаковые размеры
Иначе нарушается сетка.
2. Нет поддержки “каскадных” элементов
В отличие от masonry, элементы не могут занимать
несколько строк.
3. Ограниченная гибкость компоновки
Сетка всегда строго табличная.
Для большого количества элементов полезно:
layout()Особенно важно при галереях из сотен элементов.
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 class="grid-item">5</div>
</div>
CSS:
.grid-item {
width: 150px;
height: 150px;
background: #ddd;
text-align: center;
line-height: 150px;
}
Jav * aScript:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'cellsByRow',
cellsByRow: {
columnWidth: 150,
rowHeight: 150
}
});
Результат — равномерная сетка карточек, автоматически заполняющая строки.
Алгоритм работы режима можно представить так:
Псевдокод:
for each element:
column = index % columns
row = floor(index / columns)
x = column * columnWidth
y = row * rowHeight
Это обеспечивает строгое линейное заполнение строк.
+----+----+----+----+
| 1 | 2 | 3 | 4 |
+----+----+----+----+
| 5 | 6 | 7 | 8 |
+----+----+----+----+
| 9 |10 |11 |12 |
+----+----+----+----+
Каждый элемент занимает отдельную ячейку фиксированного размера.
При ресайзе окна:
Например:
1200px → 6 колонок
800px → 4 колонки
400px → 2 колонки
Сетка автоматически адаптируется.
cellsByRow представляет собой табличный способ
размещения элементов, в котором:
Благодаря предсказуемой структуре и простоте вычислений режим широко используется для интерфейсов с однородными карточками и строгими сетками.