Теги nav, article, section и aside в HTML: как выбрать правильный

У каждого из этих тегов - свой тест на применимость. nav - для действительно значимой навигации, а не любой группы ссылок. article - для содержимого, которое имеет смысл само по себе, в отрыве от страницы. section - для тематического блока, у которого есть (или мог бы быть) собственный заголовок; если заголовка нет и не предвидится - это просто div. aside - для содержимого, лишь косвенно связанного с окружающим текстом, независимо от того, где оно расположено на экране.

Все четыре тега сразу: nav отдельно вверху, а внутри article - тематический section со своим заголовком и aside с сопутствующим блоком. Попробуй убрать заголовок h3 у section - смысл блока станет менее понятным, хотя визуально почти ничего не изменится.

nav предназначен для действительно значимых блоков навигации - главного меню сайта, оглавления, постраничной навигации. Не каждая группа ссылок нуждается в nav: спецификация прямо называет пример - список ссылок в подвале (условия использования, главная, копирайт) вполне обходится обычным footer без отдельного nav внутри.

<nav><a href="/">Главная</a> <a href="/blog">Блог</a></nav> - главное меню сайта, значимый блок навигации.

<footer><nav><a href="/terms">Условия</a></nav></footer> - для одной мелкой ссылки в подвале отдельный nav избыточен, самого footer уже достаточно.

Самостоятельный блок контента в HTML: тег article

article - это содержимое, которое имеет смысл САМО ПО СЕБЕ, в отрыве от остальной страницы: пост в блоге, статья, комментарий, карточка товара. Проверочный вопрос простой: если вырвать этот блок и показать его отдельно (например, в RSS-ленте), останется ли он осмысленным? Если да - это article.

<article><h2>Заголовок поста</h2><p>Текст поста целиком.</p></article> - пост понятен сам по себе, вне контекста страницы.

<article>поэтому</article> - одно слово без контекста ничего не значит само по себе - не самостоятельный контент, article здесь не подходит.

Тематический блок с заголовком в HTML: тег section

section - это тематическая группа содержимого, у которой обычно есть собственный заголовок. Если у блока нет заголовка и не предполагается - скорее всего, это просто обёртка для стилей, и правильный выбор здесь div, а не section. section - не замена div "для солидности".

<section><h3>Отзывы читателей</h3>...</section> - тематический блок с собственным заголовком, законное место для section.

<section class="wrapper">...</section> - section использован просто как обёртка для CSS, без заголовка и тематического смысла - здесь нужен div.

Из истории Когда HTML5 только появился, многие разработчики начали использовать section просто как замену div "потому что звучит более семантически". Из-за этого section тогда безусловно получал ARIA-роль region, и списки ориентиров для скринридеров заполнялись десятками бессмысленных безымянных "регионов". Разработчик Rich Caloggero прямо описал эту проблему в баг-трекере спецификации в ноябре 2013 года и предложил исправление - и именно оно стало текущим правилом: role="region" у section появляется, только если у него есть доступное имя (например, заголовок), иначе роль generic - тег ничем не выделяется для скринридера.

Сопутствующий блок в HTML: тег aside

aside - это содержимое, лишь косвенно связанное с окружающим текстом: врезка-цитата, реклама, блок похожих материалов. Важно: aside определяется ОТНОШЕНИЕМ к содержимому, а не расположением на экране - врезка-цитата посреди статьи тоже может быть aside, хотя визуально это не боковая колонка.

<aside>Похожие статьи по теме</aside> - содержимое, отдельное от основного текста по смыслу, независимо от расположения на странице.

<aside>Продолжение той же мысли, что и в предыдущем абзаце</aside> - если текст на самом деле является частью основного повествования, а не косвенным дополнением, aside здесь не подходит.

Частые ошибки новичков

ОшибкаЧто происходитКак исправить
Использовать section как обычную обёртку для стилей Блок без тематического заголовка не проходит тест section - правильный тег здесь div Спрашивать себя: есть ли у блока (потенциальный) заголовок? Если нет - div
Оборачивать в nav вообще любую группу ссылок Мелкие ссылки (например, в подвале) не нуждаются в nav - самого footer достаточно Использовать nav только для действительно значимых блоков навигации
Использовать article для контента, который не имеет смысла сам по себе Блок не проходит тест "будет ли он понятен, если показать его отдельно" Использовать article только для по-настоящему самостоятельного содержимого
Путать aside с "визуальным сайдбаром" aside определяется отношением к содержимому, а не местом на странице - врезка в основной колонке тоже может быть aside Судить по смысловой связи с текстом, а не по расположению на экране

Шпаргалка

ТегКогда использовать
navТолько для значимых блоков навигации - не для каждой мелкой группы ссылок
articleСодержимое, понятное само по себе в отрыве от страницы (пост, комментарий, карточка товара)
sectionТематический блок с (потенциальным) заголовком; без заголовка - используй div
asideСодержимое, косвенно связанное с текстом - независимо от расположения на экране

Коротко: отвечаем на вопросы

Когда использовать section, а когда div?

Если блок - тематическая группа содержимого, у которой есть (или могла бы быть) собственный заголовок, и он логично попал бы в оглавление страницы - это section. Если блок нужен только для стилизации или как обёртка для скрипта, без собственной темы - используй div.

Может ли article содержать section, и наоборот?

Да, работает в обе стороны. Длинная статья может делиться на section-части (главы), а section с заголовком "Похожие посты" может содержать несколько отдельных article - карточек с превью других статей.

Обязательно ли aside должен быть визуально сайдбаром?

Нет. aside определяется отношением содержимого к окружающему тексту (косвенная связь), а не местом на странице - врезка-цитата посреди основной колонки текста тоже может быть aside, даже если это не боковая панель.

Сколько тегов nav может быть на одной странице?

Может быть несколько - например, один для навигации по всему сайту, другой для навигации внутри самой страницы (оглавление). Чтобы скринридер мог их различить, каждому nav стоит дать своё название через aria-label.

Категория
Поделиться в социальных сетях
1. Введение в HTML
2. Текст и заголовки
3. Медиа и таблицы
4. Формы
5. Семантика и доступность

Отправить комментарий

0 Комментарии

Отправить комментарий (0)

#buttons=(Хорошо) #days=(20)

Мы используем файлы cookie для улучшения работы сайта. Подробнее
Хорошо
×