Навигация и мобильное меню: где я и куда можно пойти
Названия разделов словами посетителя, три способа уместить меню в телефон, открытое мобильное меню, шапка, которая уступает место, и хлебные крошки — с живыми примерами.
Коротко
Навигация отвечает на два вопроса: где я и куда можно пойти. В главном меню до семи разделов, названных словами посетителя — «Кухни» и «Цены», а не «Решения» и «Экосистема», — и текущий раздел отмечен. На телефоне главные разделы остаются на виду: в нижней панели, в строке под шапкой или хотя бы за хорошо заметной кнопкой меню, которая открывает меню с крупными строками, поиском сверху и контактами внизу. Шапка уступает место, пока человек читает, и возвращается, как только он листает вверх. Хлебные крошки показывают путь в глубоком каталоге, а на телефоне сжимаются до одного шага назад.
Разделы — словами посетителя
Одна и та же кухонная студия. В первом меню нужно угадывать, где кухни, во втором — просто прочитать.
Люди приходят со своими словами: «кухня», «цена», «доставка». Меню на этих словах понятно с одного взгляда; меню на словах компании заставляет открывать каждый раздел. Текущий раздел отмечен не только цветом, но и формой или насыщенностью — а в коде атрибутом aria-current, чтобы его называла и экранная читалка.
Три способа уместить меню в телефон
Бургер прячет всё сразу. Два других способа держат главные разделы там, где глаз и большой палец.
разделы спрятаны, их не видно
4–5 частых разделов под пальцем
два главных раздела на виду
Какую схему выбрать
Выбор зависит от того, сколько разделов и как часто между ними переходят.
| Схема | Когда подходит | Слабое место |
|---|---|---|
| Бургер | разделов много, в каждый заходят редко | ничего не видно, разделы не находят |
| Нижняя панель | 4–5 разделов, между которыми часто переходят: магазины, личные кабинеты | нет места для шестого пункта |
| Главное + «Ещё» | два-три ключевых раздела и много второстепенных | нужно решить, что главное |
| Лента вкладок | равноправные категории каталога | пункты за краем — обрез должен показывать, что есть ещё |
Что нужно открытому мобильному меню
Меню открывают, чтобы быстро куда-то попасть. Всё, что помогает, — ближе к пальцу, остальное — прочь.
- 1крестик на месте бургера — палец уже там
- 2поиск первым: его ищут чаще всего
- 3строки от 48 px, текущий раздел отмечен
- 4телефон и мессенджер — внизу, под пальцем
Шапка, которая уступает место
На телефоне закреплённая шапка может занимать пятую часть экрана. Она прячется, пока человек читает, и возвращается при первом движении вверх.
01 Начало страницы
шапка целиком
02 Листают вниз
шапка уходит — весь экран под текст
03 Листают вверх
шапка возвращается, тоньше
Движение вверх — знак, что человек что-то ищет, и именно тогда нужно меню. Вернувшаяся шапка тоньше: логотип, кнопка меню и главное действие, без второй строки.
Хлебные крошки: путь назад
В каталоге с тремя уровнями и больше путь показывает, где находится товар, и позволяет подняться на уровень выше одним касанием.
На телефоне полный путь переносится в несколько строк и сдвигает заголовок вниз. Одна ссылка на родительский раздел делает ту же работу в одну строку. В коде полный путь остаётся — поисковики показывают его в выдаче.
Навигация в коде: 3 примера
Шапка со ссылкой «к содержанию» и отмеченной текущей страницей, стили для телефона и компьютера и небольшой скрипт для кнопки меню и прячущейся шапки.
Разметка шапки
Кнопка меню сообщает, открыто ли оно; текущая страница отмечена aria-current.
<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>
Телефон и компьютер
Меню открывается по состоянию кнопки; на компьютере кнопка не нужна.
.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 закрывает меню, шапка уходит при прокрутке вниз.
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 правил навигации
-
01
Слова посетителя
«Кухни» и «Цены», а не «Решения» и «Экосистема».
-
02
До семи пунктов
Остальное — в группы, в «Ещё» или в подвал.
-
03
Показывать, где я
Текущий раздел отмечен формой и атрибутом aria-current.
-
04
Главное на виду и на телефоне
Нижняя панель или строка под шапкой, а не всё в бургере.
-
05
Строки от 48 px
В мобильном меню палец не должен промахиваться.
-
06
Шапка возвращается при прокрутке вверх
Не занимает экран во время чтения и появляется, когда нужна.
-
07
Один порядок на всех страницах
Разделы не переезжают, а подвал повторяет главные.
Частые ошибки в навигации
-
Креативные названия разделов
Люди не угадывают и уходят на сайт, где всё названо своими именами.
-
Бургер на компьютере
Места для всего меню хватает, а его всё равно прячут.
-
Выпадающие пункты только при наведении
Их не открыть ни пальцем, ни с клавиатуры.
-
Нет отметки «вы здесь»
После двух переходов непонятно, к какому разделу относится страница.
-
Крестик не там, где был бургер
Чтобы закрыть меню, палец едет через весь экран.
-
Липкая шапка в треть экрана
На телефоне для содержимого остаются две трети.
Вопросы о навигации
Бургер или нижняя панель?
Панель — если разделов четыре-пять и между ними часто переходят. Бургер — если разделов много и в каждый заходят редко.
Сколько пунктов должно быть в главном меню?
До семи. Если больше — объединить в группы или перенести второстепенные в подвал.
Должен ли логотип вести на главную?
Да, этого ждут. Отдельный пункт «Главная» тогда не нужен.
Когда нужны хлебные крошки?
В каталогах и на сайтах с тремя уровнями и больше. На телефоне хватает одного шага назад.
Когда оправдано большое выпадающее меню?
В каталоге с десятками категорий: колонки с заголовками, открытие по нажатию, работа с клавиатуры.
Что ещё положить в мобильное меню?
То, что ищут чаще всего: поиск, телефон или мессенджер, переключатель языка и личный кабинет.
Форма
Сайт, в котором
не теряются
Проектирую структуру и навигацию сайтов и каталогов так, чтобы нужный раздел находился в два касания. Расскажите о проекте — отвечу в течение рабочего дня.