Библиотека Muuri предназначена для создания динамических сеток с возможностью перетаскивания, сортировки и анимации элементов. Одним из ключевых аспектов корректной работы сетки является правильное определение размеров её элементов. Неправильные размеры могут привести к сдвигам, наложению элементов и некорректной анимации.
item и
размерыКаждый элемент сетки в Muuri представлен объектом item.
Размеры элемента определяются автоматически на основе его
DOM-узла и применяемых стилей. Ключевыми методами
являются:
item.getWidth() — возвращает ширину
элемента в пикселях.item.getHeight() — возвращает высоту
элемента в пикселях.item.getRect() — возвращает объект с
полями {top, left, width, height}, отражающими положение и
размер элемента относительно контейнера.Эти методы позволяют динамически управлять положением и размером элементов, особенно при изменении их содержимого.
По умолчанию Muuri вычисляет размеры элементов при инициализации сетки:
const grid = new Muuri('.grid', {
layout: {
fillGaps: true,
rounding: true
}
});
Параметр rounding гарантирует округление размеров до
целых пикселей, что предотвращает размытые границы и ошибки при
позиционировании.
Если элемент изменяет размер после инициализации (например, за счет загрузки изображений), необходимо обновить размеры вручную:
grid.refreshItems().layout();
Метод refreshItems() пересчитывает размеры всех
элементов, а layout() обновляет сетку, учитывая новые
размеры.
Элементы, содержащие изображения или асинхронный контент, требуют особого подхода. Размеры таких элементов могут быть неизвестны в момент инициализации сетки. Для корректной работы используют callback при загрузке изображения:
const images = document.querySelectorAll('.grid img');
images.forEach(img => {
img.addEventListener('load', () => {
grid.refreshItems([img.parentElement]).layout();
});
});
Здесь обновление применяется только к элементу-родителю изображения, что повышает производительность.
Muuri позволяет задавать фиксированные размеры через CSS или через параметры сетки:
.grid-item {
width: 200px;
height: 150px;
}
Или через конфигурацию layout:
const grid = new Muuri('.grid', {
layout: {
horizontal: false,
alignRight: false,
alignBottom: false,
rounding: true
}
});
Использование фиксированных размеров упрощает расчёт позиций и улучшает производительность при большом количестве элементов.
Для элементов с переменной шириной или высотой
рекомендуется использовать свойство layoutOnResize:
const grid = new Muuri('.grid', {
layoutOnResize: 100 // время в мс между пересчётами при изменении размера окна
});
Это позволяет сетке адаптироваться к изменениям контейнера и окна браузера.
Размеры элементов напрямую зависят от размеров контейнера. В Muuri контейнер автоматически принимает размеры своих дочерних элементов, но при необходимости можно задать фиксированную ширину и высоту контейнера:
.grid {
width: 100%;
max-width: 1200px;
}
При динамическом изменении размеров контейнера рекомендуется
использовать метод grid.refreshItems().layout(), чтобы
элементы корректно разместились внутри нового пространства.
Muuri учитывает внешние отступы
(margin) элементов при вычислении сетки, однако
padding и border учитываются только в реальном размере
элемента, так как Muuri опирается на offsetWidth и
offsetHeight.
Для точного позиционирования рекомендуется использовать box-sizing: border-box:
.grid-item {
box-sizing: border-box;
}
Это позволяет включать padding и border в общие размеры элемента, исключая неожиданные сдвиги.
grid.refreshItems([items]).layout() —
пересчёт размеров указанных элементов или всех, если массив пустой.item.getSize() — возвращает объект
{width, height}, полезный для вычислений внутри логики
приложения.grid.getItems() — возвращает массив
всех элементов сетки, для которых можно вызвать getWidth()
и getHeight().Использование этих методов позволяет реализовать гибкое управление размерами сетки, динамическое добавление и удаление элементов, а также анимацию их перемещения без визуальных артефактов.
refreshItems() и layout().margin, padding и
border через box-sizing.load и resize для
динамических изменений.Правильное определение размеров элементов обеспечивает точное позиционирование, плавную анимацию и устойчивость сетки при любых изменениях контента или контейнера.