Библиотека Muuri предоставляет гибкий и мощный инструмент для создания сеток с возможностью динамического управления элементами. Для крупных коллекций контента важными аспектами являются пагинация и бесконечная прокрутка (infinite scroll). Эти подходы позволяют оптимизировать загрузку данных, уменьшить нагрузку на DOM и улучшить пользовательский опыт.
Пагинация предполагает деление элементов сетки на отдельные страницы. В Muuri это реализуется за счет управления видимостью элементов и динамического добавления или удаления элементов из сетки.
const grid = new Muuri('.grid', {
layout: {
rounding: false
}
});
const pageSize = 20;
let currentPage = 1;
Ключевые моменты:
pageSize определяет количество элементов на одной
странице.currentPage отслеживает текущую страницу для управления
навигацией.layout.rounding: false предотвращает
некорректное позиционирование элементов при динамическом
добавлении.function showPage(page) {
const start = (page - 1) * pageSize;
const end = page * pageSize;
grid.getItems().forEach((item, index) => {
if (index >= start && index < end) {
item.show();
} else {
item.hide();
}
});
grid.layout();
}
item.show() и item.hide() управляют
видимостью элементов.grid.layout() пересчитывает позиции видимых
элементов.document.querySelector('#nextPage').addEventListener('click', () => {
currentPage++;
showPage(currentPage);
});
document.querySelector('#prevPage').addEventListener('click', () => {
if (currentPage > 1) {
currentPage--;
showPage(currentPage);
}
});
Infinite Scroll динамически подгружает новые
элементы при достижении конца контейнера. Muuri не имеет встроенного
механизма загрузки данных, но полностью поддерживает динамическое
добавление элементов с помощью grid.add().
const container = document.querySelector('.grid-container');
container.addEventListener('scroll', () => {
if (container.scrollTop + container.clientHeight >= container.scrollHeight - 10) {
loadMoreItems();
}
});
scrollHeight - 10 используется для компенсации мелких
погрешностей браузера.function loadMoreItems() {
fetch('/api/items?offset=' + grid.getItems().length)
.then(res => res.json())
.then(data => {
const elements = data.map(itemData => {
const element = document.createElement('div');
element.className = 'item';
element.innerHTML = `<div class="item-content">${itemData.name}</div>`;
return element;
});
grid.add(elements);
});
}
grid.add(elements) автоматически интегрирует новые
элементы в сетку.В больших проектах часто применяется комбинация подходов:
function loadPageOrScroll(page) {
fetch('/api/items?page=' + page)
.then(res => res.json())
.then(data => {
const elements = data.map(itemData => createGridItem(itemData));
grid.add(elements);
});
}
Особенности реализации:
createGridItem(itemData) возвращает элемент сетки с
необходимыми классами и содержимым.grid.remove(itemsToRemove, { removeElements: true }).layout.rounding: false и
включать layout: { duration: 300 }.Пагинация и бесконечная прокрутка в Muuri позволяют создавать масштабируемые и интерактивные сетки, сохраняя плавность анимаций и высокую производительность при работе с большими объемами контента.