Библиотека Isotope позволяет создавать динамические сетки и управлять их расположением на странице с фильтрацией, сортировкой и анимацией. Для работы с модальными окнами она применяется в связке с визуальными элементами сетки, позволяя пользователю просматривать подробную информацию о каждом элементе без перезагрузки страницы. Ключевым моментом является правильная структура HTML и использование дата-атрибутов для хранения данных, которые будут отображаться в модальном окне.
Каждый элемент сетки Isotope представляет собой контейнер с классом,
например, .grid-item. Для интеграции с модальным окном
рекомендуется использовать следующие атрибуты:
<div class="grid-item" data-title="Заголовок" data-description="Описание элемента">
<img src="image.jpg" alt="Превью">
</div>
Использование дата-атрибутов позволяет хранить данные прямо в HTML, что упрощает динамическую загрузку содержимого в модальные окна.
Для создания сетки необходимо подключить библиотеку Isotope и вызвать её на контейнере с элементами:
const grid = document.querySelector('.grid');
const iso = new Isotope(grid, {
itemSelector: '.grid-item',
layoutMode: 'fitRows',
transitionDuration: '0.6s'
});
fitRows, masonry и другие).Для открытия модального окна необходимо добавить обработчик событий на каждый элемент сетки:
grid.addEventListener('click', function(event) {
const item = event.target.closest('.grid-item');
if (!item) return;
const title = item.getAttribute('data-title');
const description = item.getAttribute('data-description');
openModal(title, description);
});
Модальное окно может быть реализовано через динамическое создание элементов:
function openModal(title, description) {
const modal = document.createElement('div');
modal.classList.add('modal');
modal.innerHTML = `
<div class="modal-content">
<span class="modal-close">×</span>
<h2>${title}</h2>
<p>${description}</p>
</div>
`;
document.body.appendChild(modal);
modal.querySelector('.modal-close').addEventListener('click', () => {
closeModal(modal);
});
modal.addEventListener('click', (e) => {
if (e.target === modal) closeModal(modal);
});
}
function closeModal(modal) {
modal.remove();
}
При фильтрации элементов сетки с помощью Isotope модальные окна должны корректно работать с оставшимися элементами. Фильтрация реализуется через кнопки или ссылки:
const filters = document.querySelectorAll('.filter-button');
filters.forEach(button => {
button.addEventListener('click', () => {
const filterValue = button.getAttribute('data-filter');
iso.arrange({ filter: filterValue });
});
});
После фильтрации события клика остаются привязанными к элементам
через делегирование (grid.addEventListener), что
обеспечивает корректную работу модальных окон даже с динамически
скрытыми и показанными элементами.
Для улучшения визуального восприятия модальные окна могут открываться с эффектом масштабирования или прозрачности. Это можно реализовать через CSS:
.modal {
position: fixed;
top: 0; left: 0;
width: 100%; height: 100%;
background: rgba(0,0,0,0.7);
display: flex;
align-items: center;
justify-content: center;
opacity: 0;
transform: scale(0.8);
transition: opacity 0.3s ease, transform 0.3s ease;
}
.modal-content {
background: #fff;
padding: 20px;
border-radius: 8px;
}
.modal.show {
opacity: 1;
transform: scale(1);
}
И при открытии модального окна добавляется класс
.show:
setTimeout(() => modal.classList.add('show'), 10);
setTimeout гарантирует анимацию после
вставки элемента в DOM.Для сеток с большим количеством элементов часто данные загружаются через AJAX. В таком случае важно повторно инициализировать события модальных окон после добавления новых элементов:
function refreshModalEvents() {
grid.querySelectorAll('.grid-item').forEach(item => {
item.addEventListener('click', () => {
const title = item.getAttribute('data-title');
const description = item.getAttribute('data-description');
openModal(title, description);
});
});
}
При динамической подгрузке элементов вызывается
refreshModalEvents() для корректного функционирования
модальных окон.
Хотите, я могу написать продолжение с углублёнными практическими примерами интеграции Isotope с библиотекой анимаций и AJAX для модальных окон? Это будет прямо как полноценный учебный блок.