Создание многоуровневого меню навигации: пошаговое руководство

Пройдите тест, узнайте какой профессии подходите
Сколько вам лет
0%
До 18
От 18 до 24
От 25 до 34
От 35 до 44
От 45 до 49
От 50 до 54
Больше 55

Для кого эта статья:

  • Веб-разработчики и программисты, стремящиеся улучшить навигацию на сайтах
  • Дизайнеры интерфейсов, заинтересованные в создании удобной навигации
  • Студенты и начинающие специалисты, желающие получить практические навыки в HTML, CSS и JavaScript

    Хотите создать меню, от которого пользователи скажут "вау"? Многоуровневая навигация — это не просто функциональный элемент, а настоящая визитная карточка профессионального сайта! 🚀 В этом руководстве я раскрою все секреты создания идеального меню с подменю: от базовой структуры до продвинутых JavaScript-фишек. Готовый код, проверенные решения и никакой воды — только практические знания, которые вы сможете применить уже сегодня.

Хотите не просто читать о создании навигационных меню, а научиться создавать полноценные веб-проекты с нуля? Обучение веб-разработке от Skypro — это практический подход к изучению HTML, CSS и JavaScript от действующих разработчиков. Вы не только освоите создание интерактивных элементов интерфейса, но и получите необходимые навыки для трудоустройства. Инвестируйте в свое будущее уже сейчас!

Основные принципы создания меню навигации с подменю

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

Алексей Воронин, Front-end разработчик

Однажды мы работали над редизайном корпоративного портала с более чем 200 страницами контента. Клиент жаловался на высокий показатель отказов — пользователи просто не могли найти нужную информацию. Мы решили полностью переработать навигацию, создав трехуровневое меню. Первый уровень включал 5 основных категорий, второй — 15 подкатегорий, и третий — конкретные разделы. После внедрения такой структуры среднее время, проведенное на сайте, выросло на 43%, а показатель отказов снизился на 27%. Главный урок: даже самый качественный контент бесполезен, если пользователи не могут до него добраться.

При разработке навигационного меню с подменю следует придерживаться следующих принципов:

  • Иерархичность — структурирование информации от общего к частному, что позволяет пользователям интуитивно понимать организацию контента.
  • Предсказуемость — меню должно работать так, как ожидает пользователь, следуя общепринятым паттернам взаимодействия.
  • Доступность — навигация должна быть удобной для всех категорий пользователей, включая людей с ограниченными возможностями.
  • Ясность — названия пунктов меню должны быть понятными и информативными.
  • Отзывчивость — меню должно корректно работать на всех устройствах и при любых размерах экрана.
Тип меню Преимущества Недостатки Рекомендуемое применение
Горизонтальное выпадающее Экономит пространство, знаком пользователям Ограничено по ширине экрана Сайты с умеренным количеством категорий
Вертикальное выпадающее Вмещает больше пунктов, хорошо масштабируется Занимает больше места по вертикали Сложные каталоги, информационные порталы
Мега-меню Отображает множество опций одновременно Может перегрузить пользователя выбором Интернет-магазины, новостные сайты
Hamburger-меню Экономит место на экране, современно Скрывает опции, требует дополнительного клика Мобильные версии сайтов, минималистичные дизайны

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

💡 Совет: Не создавайте более 7±2 пунктов в меню первого уровня — это оптимальное количество для восприятия человеком согласно правилу Миллера.

Пошаговый план для смены профессии

Структура HTML для многоуровневого меню

Основа любого навигационного меню начинается с правильно структурированной HTML-разметки. Для создания многоуровневого меню мы используем вложенные списки, что обеспечивает семантичность и доступность.

Базовая структура выглядит следующим образом:

HTML
Скопировать код
<nav class="main-nav">
<ul class="nav-list">
<li class="nav-item">
<a href="#" class="nav-link">Главная</a>
</li>
<li class="nav-item has-submenu">
<a href="#" class="nav-link">Услуги</a>
<ul class="submenu">
<li class="submenu-item">
<a href="#" class="submenu-link">Веб-разработка</a>
</li>
<li class="submenu-item has-submenu">
<a href="#" class="submenu-link">Дизайн</a>
<ul class="submenu-level-2">
<li><a href="#">UI/UX дизайн</a></li>
<li><a href="#">Графический дизайн</a></li>
</ul>
</li>
<li class="submenu-item">
<a href="#" class="submenu-link">SEO-продвижение</a>
</li>
</ul>
</li>
<li class="nav-item">
<a href="#" class="nav-link">О нас</a>
</li>
<li class="nav-item">
<a href="#" class="nav-link">Контакты</a>
</li>
</ul>
</nav>

Обратите внимание на несколько ключевых моментов в этой структуре:

  • Используем тег <nav> для обозначения навигационной области.
  • Основное меню представлено в виде неупорядоченного списка <ul>.
  • Каждый пункт меню — это элемент списка <li>.
  • Для пунктов с подменю добавляем класс has-submenu, который поможет при стилизации.
  • Подменю также оформлены в виде вложенных списков, что обеспечивает логическую иерархию.

При создании многоуровневого меню важно помнить о семантической структуре. Это не только улучшает SEO, но и делает ваш сайт более доступным для пользователей с ограниченными возможностями, использующих скринридеры.

Для улучшения доступности стоит добавить атрибуты ARIA:

HTML
Скопировать код
<li class="nav-item has-submenu">
<a href="#" class="nav-link" aria-haspopup="true" aria-expanded="false">Услуги</a>
<ul class="submenu" aria-label="Подменю раздела Услуги">
...
</ul>
</li>

🔍 Важно: Атрибут aria-expanded должен динамически меняться при открытии/закрытии подменю через JavaScript.

Стилизация навигационного меню с подменю на CSS

После создания HTML-структуры, необходимо придать меню визуальную форму и интерактивность с помощью CSS. Стилизация многоуровневого меню требует внимания к деталям и понимания позиционирования элементов.

Мария Соколова, UI/UX дизайнер

На одном из проектов для медицинской клиники нам требовалось создать навигацию с 4 уровнями вложенности — направления, отделения, услуги и отдельные процедуры. Первоначально я спроектировала классическое выпадающее меню, но при тестировании оказалось, что пациенты (в основном люди старшего возраста) терялись в структуре. Мы полностью пересмотрели подход, перейдя на мега-меню с визуальными подсказками и более крупными элементами. После внедрения мы получили удивительные результаты — количество звонков с вопросами о расположении услуг снизилось на 68%, а конверсия из посещения в запись на прием выросла на 23%. Этот опыт научил меня, что иногда нужно отступить от привычных шаблонов и адаптировать интерфейс под конкретную аудиторию.

Вот базовый CSS для создания горизонтального выпадающего меню:

CSS
Скопировать код
/* Основные стили для контейнера навигации */
.main-nav {
background-color: #333;
font-family: 'Arial', sans-serif;
}

/* Сбросим стандартные стили списка */
.nav-list, .submenu, .submenu-level-2 {
list-style: none;
margin: 0;
padding: 0;
}

/* Стили для основного меню */
.nav-list {
display: flex;
}

.nav-item {
position: relative;
}

.nav-link {
display: block;
color: white;
padding: 15px 20px;
text-decoration: none;
transition: background-color 0.3s;
}

.nav-link:hover {
background-color: #555;
}

/* Стили для подменю первого уровня */
.submenu {
position: absolute;
background-color: #444;
min-width: 200px;
box-shadow: 0 8px 16px rgba(0,0,0,0.2);
opacity: 0;
visibility: hidden;
transform: translateY(10px);
transition: all 0.3s ease;
z-index: 1;
}

.has-submenu:hover > .submenu {
opacity: 1;
visibility: visible;
transform: translateY(0);
}

.submenu-item {
position: relative;
}

.submenu-link {
display: block;
padding: 12px 20px;
color: white;
text-decoration: none;
transition: background-color 0.3s;
}

.submenu-link:hover {
background-color: #555;
}

/* Стили для подменю второго уровня */
.submenu-level-2 {
position: absolute;
left: 100%;
top: 0;
background-color: #555;
min-width: 180px;
box-shadow: 0 8px 16px rgba(0,0,0,0.2);
opacity: 0;
visibility: hidden;
transform: translateX(10px);
transition: all 0.3s ease;
}

.has-submenu:hover > .submenu-level-2 {
opacity: 1;
visibility: visible;
transform: translateX(0);
}

Этот CSS-код обеспечивает следующую функциональность:

  • Горизонтальное расположение пунктов основного меню.
  • Выпадающие подменю при наведении на пункт с вложенностью.
  • Плавные анимации появления подменю с использованием CSS-переходов.
  • Подменю второго уровня появляются справа от подменю первого уровня.
  • Визуальное разделение уровней с помощью разных оттенков фона.

Для создания более интересных эффектов можно добавить дополнительные стили:

CSS
Скопировать код
/* Индикатор наличия подменю */
.has-submenu > .nav-link::after {
content: ' ▼';
font-size: 10px;
vertical-align: 1px;
}

/* Индикатор для подменю второго уровня (стрелка вправо) */
.has-submenu > .submenu-link::after {
content: ' ▶';
font-size: 10px;
float: right;
}

/* Подчеркивание активного пункта */
.nav-link:hover::before,
.nav-link.active::before {
content: '';
position: absolute;
bottom: 0;
left: 20px;
right: 20px;
height: 3px;
background-color: #ff6b6b;
}

💡 Совет: При стилизации меню используйте переменные CSS для цветовой схемы, чтобы облегчить дальнейшее обновление дизайна.

JavaScript для интерактивности выпадающего меню

Хотя чистый CSS позволяет создать базовое выпадающее меню, JavaScript добавляет расширенную функциональность, улучшает доступность и решает проблемы кроссбраузерности. Рассмотрим несколько подходов к созданию интерактивного меню с подменю.

Основные задачи, которые решает JavaScript в навигационном меню:

  • Открытие/закрытие подменю при клике (особенно важно для мобильных устройств, где нет события наведения).
  • Управление атрибутами ARIA для доступности.
  • Закрытие подменю при клике вне области меню.
  • Добавление задержки для предотвращения случайного закрытия при перемещении курсора.
  • Добавление возможности навигации с клавиатуры.

Вот базовый JavaScript-код для обработки кликов в многоуровневом меню:

JS
Скопировать код
document.addEventListener('DOMContentLoaded', function() {
const menuItems = document.querySelectorAll('.has-submenu');

// Обработка кликов по пунктам с подменю
menuItems.forEach(item => {
const link = item.querySelector('.nav-link, .submenu-link');
const submenu = item.querySelector('.submenu, .submenu-level-2');

link.addEventListener('click', function(e) {
// Предотвращаем переход по ссылке, если есть подменю
if (submenu) {
e.preventDefault();
}

// Закрываем все другие открытые подменю
menuItems.forEach(otherItem => {
if (otherItem !== item) {
const otherLink = otherItem.querySelector('.nav-link, .submenu-link');
const otherSubmenu = otherItem.querySelector('.submenu, .submenu-level-2');

if (otherSubmenu && otherSubmenu.classList.contains('active')) {
otherSubmenu.classList.remove('active');
otherLink.setAttribute('aria-expanded', 'false');
}
}
});

// Переключаем состояние текущего подменю
submenu.classList.toggle('active');

// Обновляем атрибут ARIA
const isExpanded = submenu.classList.contains('active');
link.setAttribute('aria-expanded', isExpanded ? 'true' : 'false');
});
});

// Закрытие подменю при клике вне навигации
document.addEventListener('click', function(e) {
if (!e.target.closest('.main-nav')) {
menuItems.forEach(item => {
const link = item.querySelector('.nav-link, .submenu-link');
const submenu = item.querySelector('.submenu, .submenu-level-2');

if (submenu && submenu.classList.contains('active')) {
submenu.classList.remove('active');
link.setAttribute('aria-expanded', 'false');
}
});
}
});

// Добавление поддержки навигации с клавиатуры
menuItems.forEach(item => {
const link = item.querySelector('.nav-link, .submenu-link');

link.addEventListener('keydown', function(e) {
const submenu = item.querySelector('.submenu, .submenu-level-2');

// Открытие подменю при нажатии Enter или пробела
if ((e.key === 'Enter' || e.key === ' ') && submenu) {
e.preventDefault();
submenu.classList.add('active');
link.setAttribute('aria-expanded', 'true');

// Фокус на первый элемент подменю
const firstSubmenuLink = submenu.querySelector('a');
if (firstSubmenuLink) {
firstSubmenuLink.focus();
}
}

// Закрытие подменю при нажатии Escape
if (e.key === 'Escape' && submenu && submenu.classList.contains('active')) {
submenu.classList.remove('active');
link.setAttribute('aria-expanded', 'false');
link.focus();
}
});
});
});

Для полноценного функционирования JavaScript-обработчиков необходимо добавить соответствующие CSS-стили:

CSS
Скопировать код
/* Показываем активное подменю */
.submenu.active,
.submenu-level-2.active {
opacity: 1;
visibility: visible;
transform: translateY(0) translateX(0);
}

/* Стили для фокуса элементов при навигации с клавиатуры */
.nav-link:focus,
.submenu-link:focus {
outline: 2px solid #4d90fe;
outline-offset: -2px;
}

Подход Преимущества Недостатки Применимость
Чистый CSS (hover) Простота, не требует JS Проблемы на мобильных, ограниченная доступность Простые сайты, только десктоп
JavaScript с обработкой кликов Работает на всех устройствах, гибкость Требует дополнительного кода Универсальное решение
Библиотеки (jQuery, Bootstrap) Быстрая разработка, меньше багов Дополнительная зависимость, избыточный код Проекты, уже использующие эти библиотеки
Современные фреймворки (React, Vue) Компонентный подход, реактивность Сложность интеграции в существующий проект SPA, веб-приложения

🛠 Расширенная функциональность: Для создания более сложного меню с задержкой появления/исчезновения можно использовать таймеры и управление состоянием, хранящим текущий активный пункт.

Адаптивность и оптимизация меню для разных устройств

Современные веб-сайты должны обеспечивать удобную навигацию на любых устройствах — от широкоформатных мониторов до смартфонов. Рассмотрим, как адаптировать наше многоуровневое меню для различных размеров экрана.

Основная стратегия адаптивности включает несколько подходов:

  • Трансформация горизонтального меню в вертикальное или "бургер-меню" на мобильных устройствах.
  • Изменение способа взаимодействия (с наведения на клик).
  • Оптимизация размеров элементов для удобного использования на тачскринах.
  • Переопределение позиционирования подменю для предотвращения выхода за границы экрана.

Вот CSS-код для адаптации нашего меню:

CSS
Скопировать код
/* Базовые стили остаются без изменений */

/* Медиа-запрос для планшетов */
@media screen and (max-width: 992px) {
.nav-link {
padding: 15px 15px; /* Уменьшаем отступы */
}

.submenu {
min-width: 180px; /* Уменьшаем ширину подменю */
}
}

/* Медиа-запрос для мобильных устройств */
@media screen and (max-width: 768px) {
/* Стили для гамбургер-меню */
.menu-toggle {
display: block;
cursor: pointer;
padding: 15px;
background-color: #333;
color: white;
}

.menu-toggle span {
display: block;
height: 3px;
width: 25px;
background-color: white;
margin: 5px 0;
transition: all 0.3s ease;
}

/* Анимация "гамбургера" в "крестик" */
.menu-toggle.active span:nth-child(1) {
transform: rotate(45deg) translate(5px, 6px);
}

.menu-toggle.active span:nth-child(2) {
opacity: 0;
}

.menu-toggle.active span:nth-child(3) {
transform: rotate(-45deg) translate(5px, -6px);
}

/* Изменяем основное меню */
.nav-list {
display: none; /* Скрываем по умолчанию */
flex-direction: column;
position: absolute;
top: 50px;
left: 0;
right: 0;
background-color: #333;
z-index: 1000;
}

/* Показываем меню при активации */
.nav-list.active {
display: flex;
}

/* Переопределяем подменю для мобильных */
.submenu, .submenu-level-2 {
position: static;
opacity: 1;
visibility: hidden;
display: none;
transform: none;
box-shadow: none;
width: 100%;
padding-left: 20px;
}

.submenu.active, .submenu-level-2.active {
display: block;
visibility: visible;
}

/* Изменяем индикаторы */
.has-submenu > .nav-link::after {
float: right;
content: ' +';
}

.has-submenu > .submenu-link::after {
content: ' +';
}

.has-submenu > .nav-link.active::after,
.has-submenu > .submenu-link.active::after {
content: ' -';
}
}

JavaScript для управления мобильным меню:

JS
Скопировать код
document.addEventListener('DOMContentLoaded', function() {
const menuToggle = document.querySelector('.menu-toggle');
const navList = document.querySelector('.nav-list');

// Переключатель мобильного меню
if (menuToggle) {
menuToggle.addEventListener('click', function() {
this.classList.toggle('active');
navList.classList.toggle('active');
});
}

// Модифицируем существующий код обработки подменю
const menuItems = document.querySelectorAll('.has-submenu');

menuItems.forEach(item => {
const link = item.querySelector('.nav-link, .submenu-link');
const submenu = item.querySelector('.submenu, .submenu-level-2');

link.addEventListener('click', function(e) {
// Проверяем ширину экрана
if (window.innerWidth <= 768) {
e.preventDefault();

// Переключаем активное состояние ссылки
this.classList.toggle('active');

// Переключаем видимость подменю
if (submenu) {
submenu.classList.toggle('active');
const isExpanded = submenu.classList.contains('active');
link.setAttribute('aria-expanded', isExpanded ? 'true' : 'false');
}
} else if (submenu) {
// Поведение для десктопов остается как раньше
e.preventDefault();
submenu.classList.toggle('active');
link.setAttribute('aria-expanded', submenu.classList.contains('active') ? 'true' : 'false');
}
});
});

// Обработка изменения размера окна
let resizeTimer;
window.addEventListener('resize', function() {
clearTimeout(resizeTimer);
resizeTimer = setTimeout(function() {
// Если размер окна больше мобильного порога, сбрасываем мобильные стили
if (window.innerWidth > 768) {
if (menuToggle && menuToggle.classList.contains('active')) {
menuToggle.classList.remove('active');
}

if (navList && navList.classList.contains('active')) {
navList.classList.remove('active');
}
}
}, 250);
});
});

Для дополнительного улучшения производительности и пользовательского опыта рассмотрите следующие рекомендации:

  • Отложенная загрузка — загружайте JavaScript для мобильного меню только при необходимости.
  • Использование IntersectionObserver — для ленивой загрузки контента в подменю, если это необходимо.
  • Тестирование на реальных устройствах — эмуляторы не всегда точно воспроизводят особенности взаимодействия на мобильных устройствах.
  • Добавление жестового управления — свайп для открытия/закрытия мобильного меню.

🔧 Продвинутый совет: Используйте подход "Mobile First", разрабатывая сначала мобильную версию меню, а затем расширяя её для больших экранов. Это гарантирует оптимальное отображение на всех устройствах.

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

Загрузка...