Menu

Тег nav в HTML: меню навигации и хлебные крошки

Элемент <nav> отмечает блок основных навигационных ссылок. Разберем, как сделать панель навигации из <nav> и списка, как отметить текущую страницу, как подписать несколько nav на одной странице и как сделать кнопку мобильного меню.

На этой странице есть исполняемые редакторы: меняйте, запускайте и сразу видите результат.

Панель навигации через nav

Оберните меню в <nav>, а ссылки положите в список. Flexbox превращает список в горизонтальную панель:

list-style: none и padding: 0 убирают маркеры и отступ. display: block у каждой ссылки позволяет ее внутренним отступам занимать реальное место в панели, так что целью для клика становится весь блок с отступами. Удалите строку display: flex, и то же меню станет вертикальным списком, как выглядит меню в боковой панели.

Сам <nav> никак не выглядит. Его работа это смысл: программы чтения с экрана показывают его как ориентир навигации, и пользователь может одной клавишей перейти к меню или пропустить его.

Отметка текущей страницы

Добавьте aria-current="page" ссылке на показанную страницу. Это сообщает программам чтения с экрана «вы здесь» и дает CSS за что зацепиться, чтобы подсветить ссылку:

Перенесите aria-current="page" на другую ссылку, и подсветка последует за ним. Оформление по атрибуту, а не по классу .active, держит внешний вид и доступность синхронными: одно не бывает без другого.

Несколько nav на странице: подписи и хлебные крошки

На странице может быть главное меню, хлебные крошки и оглавление, каждое в своем <nav>. Дайте каждому aria-label, чтобы программа чтения с экрана объявляла «Breadcrumb, навигация», а не три одинаковых пункта «навигация»:

Хлебные крошки используют упорядоченный список <ol>, потому что порядок важен. Косые черты берутся из CSS ::before, поэтому программы чтения с экрана не читают «косая черта» между пунктами. Последний пункт это текущая страница, и он не является ссылкой.

Оглавление

Список ссылок на разделы той же страницы тоже навигация. Ссылки #id переходят к элементу с этим id; попробуйте их в превью:

Здесь подпись берется из видимого заголовка через aria-labelledby, и это лучше, чем aria-label, когда заголовок уже есть на экране.

Кнопка мобильного меню

На узких экранах меню обычно прячется за кнопкой. Используйте настоящий <button> с aria-expanded, а ссылки оставьте внутри <nav>:

aria-expanded сообщает программе чтения с экрана, открыто ли меню, а атрибут hidden убирает список и с экрана, и из дерева доступности, пока меню закрыто. На широких экранах список показывают через медиазапрос, а кнопку скрывают.

Частые ошибки

  • Каждая группа ссылок в <nav>. Используйте его для главного меню, хлебных крошек, пагинации и оглавлений. Ссылки внутри текста не являются блоками навигации.
  • Кнопка меню из <div>. На ней нельзя сфокусироваться и ее нельзя нажать с клавиатуры. Используйте <button>.
  • Несколько nav без подписей. Добавьте каждому aria-label или aria-labelledby, чтобы их можно было различить.
  • Текущая ссылка выделена только цветом. Добавьте aria-current="page"; цвет не объявляется и может быть виден не всем.
  • Ссылки с href="#" на рабочем сайте. В демо они допустимы, но настоящим пунктам меню нужны настоящие URL, чтобы они работали при открытии в новой вкладке. Как работают значения href, описано на странице ссылки в HTML.

Часто задаваемые вопросы

Что такое тег nav в HTML?

<nav> это семантический элемент, который оборачивает блок основных навигационных ссылок, например меню сайта, оглавление или хлебные крошки. Программы чтения с экрана перечисляют его как ориентир навигации, чтобы пользователи могли сразу к нему перейти.

Нужно ли класть ссылки внутри nav в список?

Это распространенный и хороший вариант: <ul> с элементами <li> позволяет программам чтения с экрана объявить, сколько ссылок в меню. Обычные ссылки прямо внутри <nav> тоже корректны, например две или три ссылки в ряд.

Нужен ли элемент nav каждой группе ссылок?

Нет. Используйте <nav> только для основных блоков навигации. Нескольким ссылкам в абзаце или короткому списку юридических ссылок в подвале он не нужен, а слишком много ориентиров навигации мешают найти каждый из них.

Как сделать горизонтальное меню навигации?

Поместите ссылки в <ul> внутри <nav>, а затем задайте списку display: flex; list-style: none; padding: 0; и gap. Flexbox выстроит пункты в ряд.

Как показать текущую страницу в меню?

Добавьте aria-current="page" ссылке на страницу, где находится пользователь, и оформите ее селектором [aria-current="page"]. Тогда программы чтения с экрана тоже объявляют ее как текущую страницу.

Может ли на странице быть несколько nav?

Да, например главное меню, хлебные крошки и оглавление. Дайте каждому свой aria-label, например «Main» или «Breadcrumb», чтобы пользователи программ чтения с экрана могли их различать.

Coddy programming languages illustration

Учитесь программировать с Coddy

НАЧАТЬ