Инициализация сетки в библиотеке Muuri — это процесс создания
экземпляра класса Muuri, привязанного к DOM-контейнеру и
набору элементов-элементов (items). Корректность инициализации влияет на
все последующие операции: сортировку, фильтрацию, перетаскивание,
динамическое добавление и перерасчёт макета.
При создании экземпляра выполняется несколько ключевых этапов:
Любая ошибка на этих этапах приводит к некорректной работе сетки или полной остановке инициализации.
Минимальный пример создания сетки:
const grid = new Muuri('.grid', {
items: '.item'
});
Контейнер:
<div class="grid">
<div class="item">1</div>
<div class="item">2</div>
<div class="item">3</div>
</div>
После выполнения кода Muuri:
.grid.itemtransformЕсли любой из этапов выполняется некорректно, сетка либо не появится, либо будет работать с ошибками.
Первое условие корректной инициализации — наличие DOM-контейнера.
Ошибка:
const grid = new Muuri('.grid');
если .grid отсутствует в DOM.
Проверка:
const container = document.querySelector('.grid');
if (!container) {
throw new Error('Контейнер .grid не найден');
}
const grid = new Muuri(container);
Преимущества явной проверки:
Muuri должен запускаться после создания DOM-структуры.
Некорректный вариант:
const grid = new Muuri('.grid');
если скрипт подключён в <head>.
Корректный вариант:
document.addEventListener('DOMContentLoaded', () => {
const grid = new Muuri('.grid');
});
или размещение скрипта в конце документа:
<script src="app.js"></script>
</body>
Muuri работает с элементами внутри контейнера. По умолчанию используются все дочерние элементы.
Явное указание селектора:
const grid = new Muuri('.grid', {
items: '.item'
});
Проверка наличия элементов:
const items = document.querySelectorAll('.grid .item');
if (!items.length) {
console.warn('Элементы сетки отсутствуют');
}
Отсутствие элементов не вызывает критическую ошибку, но сетка будет пустой.
Muuri требует определённой структуры для корректной работы анимации и измерений.
Рекомендуемая структура:
<div class="grid">
<div class="item">
<div class="item-content">
Контент
</div>
</div>
</div>
Причины:
Инициализация:
const grid = new Muuri('.grid', {
items: '.item'
});
Muuri позиционирует элементы с помощью transform.
Контейнер должен иметь корректные стили.
Минимальный CSS:
.grid {
position: relative;
}
.item {
position: absolute;
}
.item-content {
position: relative;
}
Проблемы возникают если:
position: staticdisplay: inlineMuuri рассчитывает layout на основе размеров элементов.
Если элементы не имеют размеров, layout будет некорректным.
Ошибка:
.item {
width: auto;
}
Рекомендуется:
.item {
width: 200px;
}
или через flex-контент внутри.
Если элементы содержат изображения, layout может рассчитываться до их загрузки.
Проблема:
Решение — пересчёт layout.
grid.refreshItems().layout();
или ожидание загрузки изображений.
После инициализации каждый DOM-элемент превращается во внутренний
объект Item.
Получение списка:
const items = grid.getItems();
Проверка количества:
console.log(items.length);
Если число элементов отличается от ожидаемого — проблема в селекторе.
Каждый элемент Muuri хранит ссылку на DOM-узел.
Получение DOM-элемента:
const item = grid.getItems()[0];
const element = item.getElement();
Это позволяет проверить:
Muuri хранит состояние каждого элемента.
Получение состояния:
item.isActive();
Возможные состояния:
| Состояние | Описание |
|---|---|
| active | элемент отображается |
| hidden | элемент скрыт |
| dragging | элемент перетаскивается |
Если элемент скрыт при инициализации, он не участвует в layout.
После инициализации автоматически запускается построение layout.
Принудительный запуск:
grid.layout();
Если элементы не перемещаются, проверяются:
Muuri предоставляет события жизненного цикла.
Пример отслеживания:
grid.on('layoutEnd', function(items) {
console.log('Layout завершён', items.length);
});
Это помогает убедиться, что layout действительно выполняется.
Другие полезные события:
layoutStart
layoutEnd
add
remove
move
dragStart
dragEnd
Распространённые ошибки:
Uncaught Error: Container element not found
Причина:
Сетка создаётся, но без элементов.
Причина:
items: '.wrong-selector'
Если ширина элемента равна нулю:
layout calculation error
Причина:
display:noneДиагностика:
console.log(grid);
Проверяем:
grid._itemsgrid._layoutgrid._settingsЕсли элементы добавляются позже:
grid.add(newItems);
Если DOM изменился без Muuri, необходимо обновление:
grid.refreshItems();
grid.layout();
Muuri поддерживает несколько сеток.
Пример:
const grid1 = new Muuri('.grid-1');
const grid2 = new Muuri('.grid-2');
Диагностика:
console.log(grid1.getItems().length);
console.log(grid2.getItems().length);
Ошибки возникают если:
Muuri принимает объект конфигурации.
Пример:
const grid = new Muuri('.grid', {
dragEnabled: true,
layoutDuration: 300,
layoutEasing: 'ease'
});
Диагностика:
console.log(grid._settings);
Это позволяет проверить, применились ли параметры.
Иногда сетка создаётся повторно.
Перед повторной инициализацией необходимо уничтожение:
grid.destroy();
После:
const grid = new Muuri('.grid');
Если этого не сделать, возникают:
Практическая утилита:
function validateMuuriInit(selector) {
const container = document.querySelector(selector);
if (!container) {
console.error('Контейнер не найден');
return false;
}
const items = container.querySelectorAll('.item');
if (!items.length) {
console.warn('Элементы сетки отсутствуют');
}
items.forEach(item => {
const rect = item.getBoundingClientRect();
if (rect.width === 0 || rect.height === 0) {
console.warn('Элемент имеет нулевой размер', item);
}
});
return true;
}
Использование:
if (validateMuuriInit('.grid')) {
const grid = new Muuri('.grid');
}
Надёжная инициализация Muuri включает проверку следующих условий:
Контроль этих факторов предотвращает подавляющее большинство ошибок, возникающих при использовании библиотеки Muuri.