Библиотека Muuri в JavaScript предоставляет мощные инструменты для организации сеток с элементами, которые могут изменять размеры, перемещаться и анимироваться. Одной из ключевых возможностей является динамическое изменение размеров элементов в сетке без нарушения целостности расположения.
Для корректного изменения размеров необходимо при инициализации сетки
учитывать параметр layout и его опции:
const grid = new Muuri('.grid', {
layout: {
rounding: false,
fillGaps: true,
horizontal: false
},
dragEnabled: true
});
rounding: false — отключает округление координат, что
позволяет более точно позиционировать элементы при изменении
размеров.fillGaps: true — автоматически заполняет пустоты при
изменении размеров соседних элементов.horizontal: false — задаёт вертикальную ориентацию
сетки, важно для правильного перераспределения элементов.Muuri позволяет динамически изменять размеры отдельных
элементов через метод refreshItems и использование
CSS. Пример изменения ширины и высоты:
const item = grid.getItem(document.querySelector('.item'));
item.getElement().style.width = '200px';
item.getElement().style.height = '150px';
grid.refreshItems([item]).layout();
Здесь ключевые моменты:
getElement() возвращает DOM-элемент, к
которому можно применять CSS.refreshItems([item]) обновляет
внутренние данные сетки для конкретного элемента..layout() пересчитывает расположение
всех элементов, учитывая новые размеры.Muuri поддерживает плавную анимацию изменения размеров элементов
через CSS-переходы или встроенные параметры layoutDuration
и layoutEasing:
const grid = new Muuri('.grid', {
layoutDuration: 400,
layoutEasing: 'ease-in-out'
});
item.getElement().style.width = '250px';
item.getElement().style.height = '200px';
grid.refreshItems([item]).layout();
layoutDuration — задаёт продолжительность анимации в
миллисекундах.layoutEasing — функция сглаживания движения, которая
управляет ускорением и замедлением анимации.Для элементов с контентом, который может динамически изменяться
(например, текст или изображения), используется метод
refreshItems без передачи аргументов. Это позволяет
библиотеке автоматически определить новые размеры всех элементов:
grid.refreshItems().layout();
Такой подход особенно полезен при загрузке изображений:
const images = document.querySelectorAll('.grid img');
images.forEach(img => {
img.onl oad = () => grid.refreshItems().layout();
});
Это гарантирует, что сетка корректно адаптируется к изменению высоты или ширины элементов после загрузки изображений.
update для отдельных свойствMuuri также предоставляет метод update для частичного
обновления данных элемента без пересчета всей сетки:
item.update({
width: 180,
height: 120
});
grid.layout();
update обновляет внутренние размеры элемента, что
ускоряет процесс перераспределения при множественных изменениях.Если размеры родительского контейнера сетки меняются, необходимо уведомлять Muuri о новом пространстве. Для этого используется:
window.addEventListener('resize', () => grid.layout());
При этом важно поддерживать свойство rounding: false для
точного позиционирования и предотвращения накопления ошибок округления
при множественных изменениях размеров.
layout() при множественных изменениях размеров,
объединяя их в один вызов.refreshItems после изменения контента, особенно
при асинхронной загрузке данных.Muuri обеспечивает гибкий и высокопроизводительный механизм для
динамического изменения размеров элементов в сетке. Ключевые методы —
refreshItems, layout и update — в
сочетании с CSS-переходами позволяют управлять сеткой как в статическом,
так и в полностью динамическом режиме, обеспечивая плавность и
стабильность визуального отображения.