Навигация и мобильное меню: где я и куда можно пойти

Названия разделов словами посетителя, три способа уместить меню в телефон, открытое мобильное меню, шапка, которая уступает место, и хлебные крошки — с живыми примерами.

Интерфейс-элементы Обновлено

Коротко

Навигация отвечает на два вопроса: где я и куда можно пойти. В главном меню до семи разделов, названных словами посетителя — «Кухни» и «Цены», а не «Решения» и «Экосистема», — и текущий раздел отмечен. На телефоне главные разделы остаются на виду: в нижней панели, в строке под шапкой или хотя бы за хорошо заметной кнопкой меню, которая открывает меню с крупными строками, поиском сверху и контактами внизу. Шапка уступает место, пока человек читает, и возвращается, как только он листает вверх. Хлебные крошки показывают путь в глубоком каталоге, а на телефоне сжимаются до одного шага назад.

Разделы — словами посетителя

Одна и та же кухонная студия. В первом меню нужно угадывать, где кухни, во втором — просто прочитать.

Люди приходят со своими словами: «кухня», «цена», «доставка». Меню на этих словах понятно с одного взгляда; меню на словах компании заставляет открывать каждый раздел. Текущий раздел отмечен не только цветом, но и формой или насыщенностью — а в коде атрибутом aria-current, чтобы его называла и экранная читалка.

Три способа уместить меню в телефон

Бургер прячет всё сразу. Два других способа держат главные разделы там, где глаз и большой палец.

Всё в бургере

разделы спрятаны, их не видно

Нижняя панель

4–5 частых разделов под пальцем

Главное + «Ещё»

два главных раздела на виду

Какую схему выбрать

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

СхемаКогда подходитСлабое место
Бургер разделов много, в каждый заходят редко ничего не видно, разделы не находят
Нижняя панель 4–5 разделов, между которыми часто переходят: магазины, личные кабинеты нет места для шестого пункта
Главное + «Ещё» два-три ключевых раздела и много второстепенных нужно решить, что главное
Лента вкладок равноправные категории каталога пункты за краем — обрез должен показывать, что есть ещё

Что нужно открытому мобильному меню

Меню открывают, чтобы быстро куда-то попасть. Всё, что помогает, — ближе к пальцу, остальное — прочь.

  1. 1крестик на месте бургера — палец уже там
  2. 2поиск первым: его ищут чаще всего
  3. 3строки от 48 px, текущий раздел отмечен
  4. 4телефон и мессенджер — внизу, под пальцем

Шапка, которая уступает место

На телефоне закреплённая шапка может занимать пятую часть экрана. Она прячется, пока человек читает, и возвращается при первом движении вверх.

01 Начало страницы

шапка целиком

02 Листают вниз

шапка уходит — весь экран под текст

03 Листают вверх

шапка возвращается, тоньше

Движение вверх — знак, что человек что-то ищет, и именно тогда нужно меню. Вернувшаяся шапка тоньше: логотип, кнопка меню и главное действие, без второй строки.

Навигация в коде: 3 примера

Шапка со ссылкой «к содержанию» и отмеченной текущей страницей, стили для телефона и компьютера и небольшой скрипт для кнопки меню и прячущейся шапки.

Разметка шапки

Кнопка меню сообщает, открыто ли оно; текущая страница отмечена aria-current.

header.html
<a class="skip-link" href="#main">К содержанию</a>

<header class="header">
  <a class="header__logo" href="/">Forma</a>

  <button class="menu-toggle" type="button" aria-expanded="false" aria-controls="site-menu">
    <span class="visually-hidden">Меню</span>
    <svg viewBox="0 0 24 24" width="24" height="24" aria-hidden="true" focusable="false">
      <path d="M4 7h16M4 12h16M4 17h16" fill="none" stroke="currentColor" stroke-width="2"/>
    </svg>
  </button>

  <nav class="header__nav" id="site-menu" aria-label="Главное меню">
    <ul>
      <li><a href="/kitchens" aria-current="page">Кухни</a></li>
      <li><a href="/wardrobes">Шкафы</a></li>
      <li><a href="/prices">Цены</a></li>
      <li><a href="/measuring">Замер</a></li>
      <li><a href="/contacts">Контакты</a></li>
    </ul>
  </nav>
</header>

<main id="main">…</main>

Телефон и компьютер

Меню открывается по состоянию кнопки; на компьютере кнопка не нужна.

header.css
.skip-link { position: absolute; left: var(--space-3); top: -3rem; }
.skip-link:focus { top: var(--space-3); }

.header {
  position: sticky;
  top: 0;
  z-index: 10;
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: space-between;
  background: var(--color-surface);
  transition: transform var(--duration-base);
}

.header.is-hidden { transform: translateY(-100%); }

/* Текущая страница отмечена не только цветом */
.header__nav [aria-current="page"] {
  font-weight: 700;
  text-decoration: underline;
  text-underline-offset: 0.4em;
}

/* Телефон: меню открывается под шапкой, строки по 48px */
@media (max-width: 47.99rem) {
  .header__nav { display: none; flex-basis: 100%; }
  .menu-toggle[aria-expanded="true"] + .header__nav { display: block; }
  .header__nav a { display: flex; align-items: center; min-height: 3rem; }
}

/* Компьютер: меню видно всегда */
@media (min-width: 48rem) {
  .menu-toggle { display: none; }
  .header__nav ul { display: flex; gap: var(--space-5); }
}

@media (prefers-reduced-motion: reduce) {
  .header { transition: none; }
}

Кнопка и прячущаяся шапка

Кнопка переключает aria-expanded, Escape закрывает меню, шапка уходит при прокрутке вниз.

header.js
const toggle = document.querySelector('.menu-toggle');
const header = document.querySelector('.header');
const isOpen = () => toggle.getAttribute('aria-expanded') === 'true';

// Кнопка открывает и закрывает меню и сообщает читалке его состояние
toggle.addEventListener('click', () => {
  toggle.setAttribute('aria-expanded', String(!isOpen()));
});

// Escape закрывает меню и возвращает фокус на кнопку
document.addEventListener('keydown', (event) => {
  if (event.key === 'Escape' && isOpen()) {
    toggle.setAttribute('aria-expanded', 'false');
    toggle.focus();
  }
});

// Шапка прячется при прокрутке вниз и возвращается при прокрутке вверх
let lastY = window.scrollY;
window.addEventListener('scroll', () => {
  const y = window.scrollY;
  header.classList.toggle('is-hidden', y > lastY && y > header.offsetHeight && !isOpen());
  lastY = y;
}, { passive: true });

7 правил навигации

  1. 01

    Слова посетителя

    «Кухни» и «Цены», а не «Решения» и «Экосистема».

  2. 02

    До семи пунктов

    Остальное — в группы, в «Ещё» или в подвал.

  3. 03

    Показывать, где я

    Текущий раздел отмечен формой и атрибутом aria-current.

  4. 04

    Главное на виду и на телефоне

    Нижняя панель или строка под шапкой, а не всё в бургере.

  5. 05

    Строки от 48 px

    В мобильном меню палец не должен промахиваться.

  6. 06

    Шапка возвращается при прокрутке вверх

    Не занимает экран во время чтения и появляется, когда нужна.

  7. 07

    Один порядок на всех страницах

    Разделы не переезжают, а подвал повторяет главные.

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

  1. Креативные названия разделов

    Люди не угадывают и уходят на сайт, где всё названо своими именами.

  2. Бургер на компьютере

    Места для всего меню хватает, а его всё равно прячут.

  3. Выпадающие пункты только при наведении

    Их не открыть ни пальцем, ни с клавиатуры.

  4. Нет отметки «вы здесь»

    После двух переходов непонятно, к какому разделу относится страница.

  5. Крестик не там, где был бургер

    Чтобы закрыть меню, палец едет через весь экран.

  6. Липкая шапка в треть экрана

    На телефоне для содержимого остаются две трети.

Вопросы о навигации

Бургер или нижняя панель?

Панель — если разделов четыре-пять и между ними часто переходят. Бургер — если разделов много и в каждый заходят редко.

Сколько пунктов должно быть в главном меню?

До семи. Если больше — объединить в группы или перенести второстепенные в подвал.

Должен ли логотип вести на главную?

Да, этого ждут. Отдельный пункт «Главная» тогда не нужен.

Когда нужны хлебные крошки?

В каталогах и на сайтах с тремя уровнями и больше. На телефоне хватает одного шага назад.

Когда оправдано большое выпадающее меню?

В каталоге с десятками категорий: колонки с заголовками, открытие по нажатию, работа с клавиатуры.

Что ещё положить в мобильное меню?

То, что ищут чаще всего: поиск, телефон или мессенджер, переключатель языка и личный кабинет.

Форма

Сайт, в котором
не теряются

Проектирую структуру и навигацию сайтов и каталогов так, чтобы нужный раздел находился в два касания. Расскажите о проекте — отвечу в течение рабочего дня.

Или пишите на [email protected]