Семантическая разметка

Masonry — это библиотека для динамической компоновки элементов на веб-странице, реализующая эффект «каменной кладки». Семантическая разметка при работе с Masonry играет ключевую роль в обеспечении правильного восприятия контента как пользователем, так и поисковыми системами. Она позволяет создавать структурированные, доступные и логически организованные блоки без потери визуального эффекта.

Семантика контейнера

Контейнер, внутри которого Masonry располагает элементы, должен иметь логический HTML-тег, соответствующий типу контента. Для коллекций изображений или карточек товаров целесообразно использовать <section> или <div> с атрибутом role="list". Если контент представляет собой список статей, предпочтительнее <ul> или <ol>.

<section class="grid" role="list">
  <article class="grid-item" role="listitem">
    <h2>Заголовок статьи</h2>
    <p>Краткое описание контента.</p>
  </article>
  <article class="grid-item" role="listitem">
    <h2>Заголовок статьи</h2>
    <p>Краткое описание контента.</p>
  </article>
</section>

В этом примере каждый элемент Masonry (grid-item) оформлен как <article> с role="listitem", что сохраняет логическую структуру документа.

Семантика элементов

Каждый блок, размещаемый Masonry, должен быть самостоятельным и семантически корректным. Для изображений используется <figure> с подписью <figcaption>:

<figure class="grid-item">
  <img src="image1.jpg" alt="Описание изображения">
  <figcaption>Подпись к изображению</figcaption>
</figure>

Это обеспечивает доступность контента для экранных читалок и улучшает SEO, позволяя поисковикам правильно индексировать изображения.

Атрибуты ARIA

При динамическом добавлении и перестройке элементов Masonry важна поддержка ARIA-атрибутов. Атрибуты role, aria-label, aria-live помогают пользователю ориентироваться в изменяющемся контенте:

  • role="list" для контейнера;
  • role="listitem" для элементов;
  • aria-live="polite" для контейнера при динамическом добавлении новых элементов.

Пример динамического добавления элементов с Masonry и ARIA:

var grid = document.querySelector('.grid');
var msnry = new Masonry(grid, {
  itemSelector: '.grid-item',
  columnWidth: '.grid-sizer',
  percentPosition: true
});

function addItem(content) {
  var item = document.createElement('article');
  item.className = 'grid-item';
  item.setAttribute('role', 'listitem');
  item.innerHTML = `<h2>${content.title}</h2><p>${content.text}</p>`;
  grid.appendChild(item);
  msnry.appended(item);
}

Использование <header> и <footer> внутри элементов

Каждый элемент Masonry может содержать собственные заголовки и футеры для структурирования информации:

<article class="grid-item">
  <header>
    <h2>Название карточки</h2>
  </header>
  <p>Описание контента карточки.</p>
  <footer>
    <small>Дата публикации: 13 марта 2026</small>
  </footer>
</article>

Такой подход обеспечивает четкую семантическую иерархию и делает код удобным для поддержки.

Стилизация с сохранением семантики

Стилизовать Masonry можно без нарушения семантики. Для контейнера применяется класс .grid, для элементов — .grid-item. Сетка задается через CSS Flexbox или CSS Grid:

.grid {
  display: flex;
  flex-wrap: wrap;
  margin: -10px;
}

.grid-item {
  width: 200px;
  margin: 10px;
  box-sizing: border-box;
}

Masonry автоматически распределяет элементы по колонкам, сохраняя исходную семантическую структуру.

Доступность и SEO

Семантическая разметка повышает:

  • доступность для пользователей с ограниченными возможностями;
  • корректное индексирование поисковыми системами;
  • правильное воспроизведение контента при изменении размеров окна или на мобильных устройствах.

Практические рекомендации

  • Использовать логические HTML-теги для всех блоков.
  • Каждый элемент Masonry должен быть самостоятельным контентным блоком.
  • Применять ARIA-атрибуты для динамически добавляемых элементов.
  • Сохранять заголовки и подписи внутри каждого блока.
  • Минимизировать использование <div> без семантической необходимости.

Соблюдение этих принципов обеспечивает совместимость Masonry с современными стандартами веб-разработки и делает страницу структурированной, доступной и SEO-дружелюбной.