Isotope — это мощная библиотека для организации и фильтрации элементов в веб-интерфейсе. Она предоставляет гибкие механизмы для сортировки, фильтрации и динамической перестройки сеток элементов с анимацией. Ключевым преимуществом Isotope является сочетание простоты API и высокой производительности при работе с большими наборами данных.
Для подключения библиотеки достаточно добавить её через CDN или локальный файл:
<script src="https://unpkg.com/isotope-layout@3/dist/isotope.pkgd.min.js"></script>
Инициализация Isotope выполняется на контейнере элементов:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'fitRows'
});
Здесь .grid — контейнер с элементами,
.grid-item — отдельные элементы сетки,
layoutMode определяет способ расположения элементов
(fitRows, masonry, vertical,
cellsByRow).
Isotope предоставляет гибкие методы фильтрации и сортировки:
// Фильтрация по классу
iso.arrange({ filter: '.featured' });
// Сортировка по атрибуту
iso.arrange({
sortBy: 'name',
getSortData: {
name: '[data-name]'
}
});
Фильтры могут использоваться динамически, что позволяет создавать интерактивные интерфейсы с кнопками:
var filtersElem = document.querySelector('.filters-button-group');
filtersElem.addEventListener('click', function(event) {
if (!matchesSelector(event.target, 'button')) {
return;
}
var filterValue = event.target.getAttribute('data-filter');
iso.arrange({ filter: filterValue });
});
Isotope умеет корректно работать с динамически добавляемыми
элементами. После добавления нового элемента необходимо вызвать метод
appended:
var newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.textContent = 'Новый элемент';
document.querySelector('.grid').appendChild(newItem);
iso.appended(newItem);
Для обновления фильтров после добавления элементов используется метод
layout:
iso.layout();
Isotope поддерживает плавные анимации при перестройке сетки. Для
настройки анимации используются параметры
transitionDuration и
hiddenStyle/visibleStyle:
var iso = new Isotope('.grid', {
itemSelector: '.grid-item',
layoutMode: 'masonry',
transitionDuration: '0.6s',
hiddenStyle: { opacity: 0, transform: 'scale(0.8)' },
visibleStyle: { opacity: 1, transform: 'scale(1)' }
});
Это позволяет создать эффект плавного появления и исчезновения элементов при фильтрации или сортировке.
Для тестирования функциональности Isotope рекомендуется использовать фреймворки типа Jest или Mocha с jsdom, чтобы эмулировать DOM-среду. Основные цели тестирования:
Пример теста фильтрации с Jest:
import Isotope from 'isotope-layout';
describe('Isotope фильтрация', () => {
let container;
beforeEach(() => {
document.body.innerHTML = `
<div class="grid">
<div class="grid-item featured">1</div>
<div class="grid-item">2</div>
<div class="grid-item featured">3</div>
</div>
`;
container = document.querySelector('.grid');
});
test('Фильтрация по классу featured', () => {
const iso = new Isotope(container, { itemSelector: '.grid-item' });
iso.arrange({ filter: '.featured' });
const visibleItems = Array.from(container.children).filter(
item => item.style.display !== 'none'
);
expect(visibleItems.length).toBe(2);
});
});
Для проверки сортировки и добавления элементов также используют имитацию DOM:
test('Сортировка по атрибуту data-name', () => {
const iso = new Isotope(container, {
itemSelector: '.grid-item',
getSortData: { name: '[data-name]' }
});
const firstItem = container.querySelector('.grid-item');
firstItem.setAttribute('data-name', 'B');
const secondItem = container.querySelectorAll('.grid-item')[1];
secondItem.setAttribute('data-name', 'A');
iso.arrange({ sortBy: 'name' });
const sortedNames = Array.from(container.children).map(el => el.getAttribute('data-name'));
expect(sortedNames).toEqual(['A', 'B']);
});
test('Добавление нового элемента', () => {
const iso = new Isotope(container, { itemSelector: '.grid-item' });
const newItem = document.createElement('div');
newItem.className = 'grid-item';
newItem.textContent = 'Новый';
container.appendChild(newItem);
iso.appended(newItem);
expect(container.contains(newItem)).toBe(true);
});
transitionDuration, чтобы избежать ошибок, связанных
с асинхронными изменениями стилей.classList,
атрибуты, используемые для фильтрации и сортировки.Isotope поддерживает сложные фильтры с функциями:
iso.arrange({
filter: function(itemElem) {
return itemElem.textContent.includes('Featured');
}
});
Это позволяет создавать гибкие условия для отображения элементов и легко проверять их с помощью юнит-тестов, имитируя разные сценарии данных.