Библиотека Isotope управляет расположением элементов внутри контейнера, используя вычисляемую сетку и алгоритмы размещения. В стандартной конфигурации элементы располагаются вплотную друг к другу, а визуальные промежутки между ними создаются средствами CSS или дополнительными параметрами конфигурации.
Отступы между элементами влияют на:
Поскольку Isotope работает поверх CSS-разметки, отступы реализуются несколькими способами. Каждый способ влияет на алгоритм размещения элементов по-разному.
Основные методы создания отступов:
marginpadding контейнераguttergutter-sizer)fitRowsСамый простой и распространённый способ — добавление внешних отступов у элементов сетки.
<div class="grid">
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
.grid-item {
width: 200px;
margin: 10px;
}
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry'
});
В данном случае расстояние между карточками формируется за счёт
margin. Алгоритм Masonry учитывает
фактическую ширину элементов вместе с отступами, поэтому расположение
остаётся корректным.
Преимущества:
Недостатки:
Часто применяется дополнительная корректировка:
.grid {
margin: -10px;
}
Это компенсирует внешние margin элементов.
Отступы могут задаваться не между элементами, а по краям контейнера.
.grid {
padding: 20px;
}
Этот подход используется для:
Важно учитывать, что padding не влияет на расстояние между элементами, а только формирует внутренние границы контейнера.
В режиме Masonry библиотека предоставляет
специальный параметр gutter, предназначенный для задания
расстояния между колонками.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
masonry: {
gutter: 20
}
});
Параметр gutter добавляет фиксированный промежуток между
колонками и строками.
Алгоритм рассчитывает координаты элементов следующим образом:
позиция = ширина_колонки + gutter
Таким образом создаётся равномерная сетка.
.grid-item {
width: 200px;
}
Отступы больше не задаются через margin.
Метод подходит для:
Более гибкий вариант настройки — использование отдельного элемента-шаблона, определяющего ширину промежутков.
<div class="grid">
<div class="grid-sizer"></div>
<div class="gutter-sizer"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
.grid-sizer,
.grid-item {
width: 25%;
}
.gutter-sizer {
width: 2%;
}
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
percentPosition: true,
masonry: {
columnWidth: '.grid-sizer',
gutter: '.gutter-sizer'
}
});
Алгоритм вычисляет:
ширина_колонки = grid-sizer
расстояние = gutter-sizer
Благодаря этому сетка корректно изменяется при изменении ширины экрана.
Режим fitRows размещает элементы строками, поэтому механизм отступов работает иначе.
var iso = new Isotope('.grid', {
layoutMode: 'fitRows',
itemSelector: '.grid-item'
});
В этом режиме рекомендуется использовать margin.
.grid-item {
width: 200px;
margin: 10px;
}
Алгоритм размещает элементы последовательно, а отступы создают промежутки между ними.
Иногда используется комбинированный подход.
Пример:
.grid-item {
width: 200px;
margin-bottom: 20px;
}
masonry: {
gutter: 20
}
Здесь:
gutter создаёт горизонтальные промежуткиmargin-bottom формирует вертикальные отступыЭто позволяет точнее контролировать структуру сетки.
При изменении ширины экрана расстояния между элементами могут корректироваться.
.grid-item {
width: 25%;
}
@media (max-width: 900px) {
.grid-item {
width: 50%;
}
}
@media (max-width: 500px) {
.grid-item {
width: 100%;
}
}
var iso = new Isotope('.grid', {
masonry: {
gutter: 30
}
});
В некоторых случаях используется динамическое изменение параметров.
iso.options.masonry.gutter = 10;
iso.layout();
После изменения параметра необходимо вызвать пересчёт расположения.
Изменение CSS-параметров может нарушить текущую структуру сетки. Для обновления расположения применяется метод:
iso.layout();
Он запускает повторный расчёт координат элементов.
При загрузке изображений часто используется дополнительная библиотека:
imagesLoaded('.grid', function() {
iso.layout();
});
Это предотвращает смещение элементов из-за изменения их размеров.
Чем сложнее структура сетки, тем больше вычислений выполняет Isotope.
Факторы влияния:
Рекомендации оптимизации:
layout()Возникают при одновременном использовании margin и
gutter.
Причина — внешние margin элементов. Исправляется
отрицательным margin контейнера.
.grid {
margin-left: -10px;
}
Проблема возникает из-за изменения высоты элементов.
Решение:
imagesLoaded + layout()
<div class="grid">
<div class="grid-sizer"></div>
<div class="gutter-sizer"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
<div class="grid-item"></div>
</div>
.grid-sizer,
.grid-item {
width: 30%;
}
.gutter-sizer {
width: 5%;
}
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
percentPosition: true,
masonry: {
columnWidth: '.grid-sizer',
gutter: '.gutter-sizer'
}
});
Такая конфигурация обеспечивает: