Панель навигации через 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», чтобы пользователи программ чтения с экрана могли их различать.