Библиотека Muuri предоставляет гибкую систему для создания динамических сеток, которые автоматически перестраиваются при изменении размеров контейнера или количества элементов. Работа с responsive элементами строится вокруг нескольких ключевых концепций: адаптивная ширина и высота элементов, перестройка сетки при изменении размеров окна, и динамическая фильтрация и сортировка элементов.
Для того чтобы элементы сетки корректно подстраивались под разные разрешения экрана, необходимо использовать CSS-подход с относительными единицами измерения. Muuri учитывает размеры элементов на момент инициализации, поэтому:
width: 25%) позволяет равномерно распределять элементы в
строке.box-sizing: border-box
предотвращает искажения размеров при добавлении отступов и границ.height: auto) совместно
с изображениями, имеющими max-width: 100%, позволяет
элементам корректно масштабироваться по содержимому..item {
width: 25%;
padding: 10px;
box-sizing: border-box;
}
.item img {
width: 100%;
height: auto;
display: block;
}
При такой настройке Muuri автоматически учитывает размеры элементов и выстраивает их в сетку, которая изменяет количество колонок в зависимости от ширины контейнера.
Для responsive сеток критически важно, чтобы Muuri обновлял
положение элементов при изменении размера контейнера. Для этого
используется метод refreshItems() и событие
onResize или обработка события
window.resize.
const grid = new Muuri('.grid', {
dragEnabled: true,
layout: {
rounding: false // точное позиционирование элементов
}
});
window.addEventListener('resize', () => {
grid.refreshItems().layout();
});
refreshItems() обновляет внутренние размеры
элементов.layout() пересчитывает позиции элементов в сетке.rounding: false предотвращает округление
координат, что важно для точного соответствия сетки и адаптивных
размеров.Для адаптивной сетки часто используют динамическое количество
колонок в зависимости от ширины контейнера. В Muuri это
реализуется через настройку layout и метод
layoutOnResize: true.
const grid = new Muuri('.grid', {
layout: {
fillGaps: true,
horizontal: false,
alignRight: false,
alignBottom: false,
rounding: false
}
});
fillGaps: true — элементы заполняют пустые промежутки,
возникающие при разной высоте.horizontal: false — вертикальное размещение элементов,
которое проще масштабировать при адаптивном дизайне.Также можно вручную пересчитывать количество колонок при определённых breakpoints:
function updateColumns() {
const width = window.innerWidth;
let columns;
if (width < 600) columns = 1;
else if (width < 900) columns = 2;
else columns = 3;
document.querySelectorAll('.item').forEach(item => {
item.style.width = `${100 / columns}%`;
});
grid.refreshItems().layout();
}
window.addEventListener('resize', updateColumns);
updateColumns();
Responsive сетка часто требует динамической фильтрации или
сортировки элементов, например, для показа элементов в
зависимости от размеров экрана или контента. Muuri предоставляет методы
filter() и sort().
// Фильтрация элементов по data-атрибуту
grid.filter(item => {
return window.innerWidth > 800 ? true : item.getElement().dataset.type !== 'large';
});
// Сортировка по data-атрибуту
grid.sort((a, b) => {
return a.getElement().dataset.order - b.getElement().dataset.order;
});
filter() принимает функцию, возвращающую
true для отображаемых элементов.sort() переставляет элементы с анимацией, сохраняя
адаптивность сетки.Эти методы можно вызывать после resize для корректного
отображения элементов в responsive-макете.
Responsive сетки с большим количеством элементов могут снижать производительность при постоянной пересборке. Рекомендации:
layoutOnResize: false и вручную вызывать
refreshItems().layout() только при необходимости.resize и
использовать дебаунсинг:let resizeTimeout;
window.addEventListener('resize', () => {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(() => {
updateColumns();
}, 150);
});
Muuri может работать вместе с CSS Grid и Flexbox, но при responsive сетках предпочтение стоит отдавать Flexbox для простоты динамического изменения ширины элементов.
.grid {
display: flex;
flex-wrap: wrap;
}
.item {
flex: 1 0 25%;
}
В сочетании с Muuri это обеспечивает гибкую сетку, которая плавно перестраивается на любых разрешениях.
Эти методы и подходы создают основу для построения responsive сеток на базе Muuri, позволяя управлять размерами, фильтрацией, сортировкой и перестройкой сетки при изменении размеров окна без потери производительности.