Isotope — это мощная JavaScript-библиотека для организации и фильтрации сеток элементов. Для начала работы необходимо подключить библиотеку в проект. Обычно это делается через CDN или локальную копию скрипта:
После подключения создается контейнер для элементов сетки, например:
Инициализация выполняется следующим образом:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
percentPosition: true,
masonry: {
columnWidth: '.grid-item'
}
});
Ключевые моменты инициализации:
itemSelector — селектор элементов внутри контейнера,
которые будут участвовать в сетке.layoutMode — режим расположения (masonry,
fitRows, vertical). Masonry
позволяет создавать сетку с переменной высотой элементов.percentPosition — если включено, размеры элементов
вычисляются в процентах, что важно для адаптивного дизайна.masonry.columnWidth — задает ширину колонки, можно
указать селектор элемента или число в пикселях.При работе с сеткой, где элементы содержат изображения, важно учитывать, что размер сетки вычисляется сразу после инициализации. Если изображения загружаются асинхронно, сетка может «ломаться», так как размеры еще неизвестны. Для корректной работы применяют placeholder.
Placeholder — это временный элемент или изображение, используемое для резервирования места до полной загрузки настоящего контента. Обычно это однотонный фон или маленькое изображение низкого разрешения.
Пример использования placeholder:
JavaScript для замены placeholder на реальное изображение:
var gridItems = document.querySelectorAll('.grid-item img');
gridItems.forEach(function(img) {
var realSrc = img.getAttribute('data-src');
var newImg = new Image();
newImg.src = realSrc;
newImg.onl oad = function() {
img.src = realSrc;
iso.layout(); // обновление сетки после загрузки изображения
}
});
Особенности подхода:
data-src хранит настоящий URL изображения.Image, чтобы дождаться полной
загрузки, прежде чем вставлять изображение в DOM.iso.layout() после загрузки гарантирует
правильное расположение элементов в сетке.Isotope позволяет не только располагать элементы, но и фильтровать их по категориям. При использовании placeholder фильтрация работает одинаково, только важно, чтобы все элементы имели корректную высоту после загрузки изображений.
Пример фильтрации:
var filterButtons = document.querySelectorAll('.filter-button-group button');
filterButtons.forEach(function(button) {
button.addEventListener('click', function() {
var filterValue = button.getAttribute('data-filter');
iso.arrange({ filter: filterValue });
});
});
Замечания:
imagesLoaded для отслеживания
полной загрузки.imagesLoaded('.grid', function() {
iso.layout();
});
Для сеток с большим количеством элементов placeholder особенно важен при адаптивной верстке и ленивой загрузке:
percentPosition: true, сетка автоматически перестраивается
при изменении ширины окна. Placeholder сохраняет место до загрузки
изображения.Пример реализации ленивой загрузки с Isotope:
var lazyImages = document.querySelectorAll('.grid-item img[data-src]');
var observer = new IntersectionObserver(function(entries) {
entries.forEach(function(entry) {
if (entry.isIntersecting) {
var img = entry.target;
img.src = img.dataset.src;
img.onl oad = function() {
iso.layout();
}
observer.unobserve(img);
}
});
}, { threshold: 0.1 });
lazyImages.forEach(function(img) {
observer.observe(img);
});
Isotope поддерживает плавные переходы при изменении положения
элементов. Для этого используется CSS-свойство
transition:
.grid-item {
transition: transform 0.4s, opacity 0.4s;
}
При подгрузке реального изображения можно добавить эффект появления:
.grid-item img {
opacity: 0;
transition: opacity 0.5s;
}
.grid-item img.loaded {
opacity: 1;
}
JavaScript для активации эффекта:
newImg.onl oad = function() {
img.src = realSrc;
img.classList.add('loaded');
iso.layout();
}
Это делает процесс замены placeholder на изображение плавным и визуально приятным, без резких скачков сетки.