Библиотека Isotope предоставляет механизм интеллектуального размещения элементов внутри контейнера. Основу работы составляет система layout modes — алгоритмов, определяющих способ позиционирования элементов на странице.
Каждый макет реализует собственный принцип вычисления координат элементов и используется для разных типов интерфейсов: галерей, карточных сеток, каталогов товаров, панелей фильтрации и других структур.
Ключевая идея — отделение данных от визуального расположения. Один и тот же набор элементов может отображаться различными способами, переключаясь между макетами без изменения HTML-структуры.
Поддерживаемые типы макетов:
Переключение между ними выполняется через параметр
layoutMode.
var iso = new Isotope('.grid', {
layoutMode: 'masonry'
});
При смене режима библиотека автоматически пересчитывает позиции элементов.
Masonry — наиболее популярный режим. Он имитирует кладку кирпичей: элементы располагаются в колонках, занимая минимально возможное вертикальное пространство.
Принцип работы:
Результат — плотная вертикальная сетка без пустот.
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
masonry: {
columnWidth: 200,
gutter: 10
}
});
columnWidth
Ширина базовой колонки.
columnWidth: 200
Допускается использование CSS-элемента:
columnWidth: '.grid-sizer'
gutter
Расстояние между колонками.
gutter: 10
Макет fitRows располагает элементы по строкам, аналогично стандартной сетке.
Алгоритм работы:
var iso = new Isotope('.grid', {
layoutMode: 'fitRows'
});
Главное ограничение — неэффективное использование пространства при разной высоте элементов.
Макет vertical располагает элементы строго вертикально.
Каждый элемент занимает всю ширину контейнера.
Алгоритм:
var iso = new Isotope('.list', {
layoutMode: 'vertical'
});
Основная ценность режима — возможность фильтрации элементов без перестройки структуры списка.
Packery — расширенный алгоритм размещения элементов.
Работает по принципу двумерной упаковки (bin packing).
Алгоритм:
В отличие от masonry:
Packery используется через дополнительный режим layoutMode.
var iso = new Isotope('.grid', {
layoutMode: 'packery',
packery: {
gutter: 10
}
});
Packery часто применяется в интерфейсах dashboard.
Макет cellsByRow делит контейнер на фиксированную сетку.
Принцип:
var iso = new Isotope('.grid', {
layoutMode: 'cellsByRow',
cellsByRow: {
columnWidth: 150,
rowHeight: 120
}
});
columnWidth
ширина ячейки.
rowHeight
высота ячейки.
Каждый элемент занимает одну ячейку сетки.
Этот режим аналогичен предыдущему, но заполнение происходит по колонкам.
Алгоритм:
var iso = new Isotope('.grid', {
layoutMode: 'cellsByColumn',
cellsByColumn: {
columnWidth: 150,
rowHeight: 120
}
});
masonryHorizontal — горизонтальная версия masonry.
Отличия:
var iso = new Isotope('.grid', {
layoutMode: 'masonryHorizontal',
masonryHorizontal: {
rowHeight: 200
}
});
Макет fitColumns — горизонтальный аналог fitRows.
Алгоритм:
var iso = new Isotope('.grid', {
layoutMode: 'fitColumns'
});
Макет horizontal размещает элементы строго по горизонтали.
Элементы располагаются в одну линию.
var iso = new Isotope('.row', {
layoutMode: 'horizontal'
});
Isotope позволяет динамически менять режимы размещения.
iso.arrange({
layoutMode: 'fitRows'
});
Переключение происходит без перезагрузки страницы.
Часто используется вместе с кнопками интерфейса:
document.querySelector('#masonry').oncl ick = function() {
iso.arrange({ layoutMode: 'masonry' });
};
document.querySelector('#rows').oncl ick = function() {
iso.arrange({ layoutMode: 'fitRows' });
};
| Макет | Поддержка разных размеров | Основная ориентация |
|---|---|---|
| masonry | да | вертикальная |
| fitRows | ограниченная | вертикальная |
| vertical | нет | вертикальная |
| packery | да | свободная |
| cellsByRow | нет | сетка |
| cellsByColumn | нет | сетка |
| masonryHorizontal | да | горизонтальная |
| fitColumns | ограниченная | горизонтальная |
| horizontal | нет | горизонтальная |
Каждый макет в Isotope реализуется как отдельный модуль.
Базовый процесс размещения:
Элементы позиционируются через transform:
transform: translate3d(x, y, 0);
Такой подход:
Isotope допускает расширение через пользовательские layout modes.
Базовая структура:
Isotope.LayoutMode.create('customMode');
Методы:
_resetLayout_getItemLayoutPosition_getContainerSizeПример:
var Custom = Isotope.LayoutMode.create('customMode');
Custom.prototype._getItemLayoutPosition = function(item) {
return {
x: 0,
y: 0
};
};
Такой подход позволяет реализовать:
Несколько рекомендаций для эффективной работы layoutMode:
Использование sizing-элементов
.grid-sizer {
width: 25%;
}
Отложенная инициализация изображений
Совместное использование с библиотекой:
Минимизация DOM-операций
Лучше добавлять элементы пакетно:
iso.appended(items);
Рекомендации по выбору:
Галереи изображений
Каталоги товаров
Списки
Dashboard
Горизонтальные интерфейсы
Правильный выбор layoutMode значительно влияет на: