Часы работы пн-пт 9:00 — 18:00
Адрес г. Тула, ул. Некрасова, 7, оф. 315
Как создать гамбургер меню, используя CSS и HTML?

Как создать гамбургер меню, используя CSS и HTML?

Owebs
21 марта 2025
Просмотры 3498
Рейтинг
Время чтения Время чтения: 16 минут

В 2025 году 68% трафика приходит с мобильных устройств (по данным Яндекс.Метрики), и меню на маленьких экранах должно сворачиваться в компактную кнопку — классический «гамбургер» с тремя полосками. Это не просто тренд, а необходимость: Google и Яндекс ранжируют адаптивные сайты выше. Без бургер-меню пользователи на смартфонах не найдут навигацию, а отказы вырастут на 40%. В этой статье разберём, как создать плавно анимированную кнопку на чистом CSS без JavaScript. Полный код, примеры, адаптивность и вариации под ваш дизайн.

Зачем нужна кнопка-гамбургер и как она работает

На десктопе меню горизонтальное, на мобильном — вертикальное. Гамбургер-меню — это иконка из трёх горизонтальных линий, которая при клике превращается в крестик и раскрывает боковое меню. Анимация делает интерфейс живым и интуитивным, повышая удобство на 25% (по данным Nielsen Norman Group). CSS-эффекты: полоски вращаются, создавая крест, с плавным transition. В отличие от JavaScript, CSS-анимация не нагружает процессор и работает быстрее: при использовании transition вместо JS-циклов производительность рендеринга возрастает на 30-40% за счёт GPU-ускорения. Для более сложных сценариев (например, аккордеон или слайдер) применяют CSS @keyframes — это задаёт ключевые кадры и позволяет управлять длительностью без привязки к событию click.

Полный код: HTML, CSS, JavaScript

Кнопка состоит из контейнера .burger с .burgerBox внутри и .burgerInner — полосками. Анимация через ::before и ::after. Для реактивных эффектов (hover и focus) используем CSS-псевдоклассы — это меняет стили без JS, а плавное изменение обеспечивается свойством transition.

HTML

<div class="burger burgerSlider">
  <div class="burgerBox">
    <div class="burgerInner"></div>
  </div>
</div>

CSS

.burger {
  padding: 15px;
  display: inline-block;
  cursor: pointer;
  transition: opacity 0.15s linear;
  background: transparent;
  border: 0;
  margin: 0;
  overflow: visible;
  font: inherit;
  color: inherit;
}

.burger:hover {
  opacity: 0.7;
}

.burgerBox {
  width: 40px;
  height: 24px;
  position: relative;
}

.burgerInner {
  display: block;
  top: 50%;
  margin-top: -2px;
}

.burgerInner,
.burgerInner::before,
.burgerInner::after {
  width: 40px;
  height: 4px;
  background: #000;
  border-radius: 4px;
  position: absolute;
  transition: transform 0.15s ease;
}

.burgerInner::before,
.burgerInner::after {
  content: "";
  display: block;
}

.burgerInner::before {
  top: -10px;
}

.burgerInner::after {
  bottom: -10px;
}

/* Слайдер-анимация */
.burgerSlider .burgerInner {
  top: 2px;
}

.burgerSlider .burgerInner::before {
  top: 10px;
  transition: transform 0.15s ease, opacity 0.15s ease;
}

.burgerSlider .burgerInner::after {
  top: 20px;
}

.burgerSlider.active .burgerInner {
  transform: translate3d(0, 10px, 0) rotate(45deg);
}

.burgerSlider.active .burgerInner::before {
  transform: rotate(-45deg) translate3d(-5.714px, -6px, 0);
  opacity: 0;
}

.burgerSlider.active .burgerInner::after {
  transform: translate3d(0, -20px, 0) rotate(-90deg);
}

JavaScript

document.querySelectorAll('.burger').forEach(burger => {
  burger.addEventListener('click', function () {
    burger.classList.toggle('active');
  });
});
 

Как подключить меню и кнопку

Добавьте CSS и JS в <head> или <body>. HTML — в хедер или навбар. Для раскрытия меню используйте .active на родительском контейнере. В отличие от аккордеона или слайдера, где требуется JS для каждого шага, здесь анимация полностью на CSS — это снижает нагрузку на браузер и упрощает поддержку.

<nav class="navbar">
  <div class="burger burgerSlider" onclick="toggleMenu()">...</div>
  <ul class="menu" id="menu">
    <li><a href="#">Главная</a></li>
    <li><a href="#">Услуги</a></li>
  </ul>
</nav>

<script>
function toggleMenu() {
  document.getElementById('menu').classList.toggle('active');
}
</script>

<style>
.menu {
  display: none;
}

.menu.active {
  display: block;
}

@media (min-width: 768px) {
  .burger { display: none; }
  .menu { display: flex; }
}
</style>

Вариации: цвета и эффекты

Базовый CSS легко кастомизировать. Меняйте цвета, размеры, добавляйте тени. Для реактивных эффектов (hover/focus/click) используйте псевдоклассы — это делает кнопку отзывчивой без дополнительного JS. Если нужна более сложная анимация (например, вращение в стиле слайдера), применяйте @keyframes — это задаёт ключевые кадры и управляет длительностью.

Белая кнопка на тёмном фоне

.burger-white {
  color: #fff;
}

.burger-white .burgerInner,
.burger-white .burgerInner::before,
.burger-white .burgerInner::after {
  background: #fff;
}

.burger-white.active .burgerInner,
.burger-white.active .burgerInner::before,
.burger-white.active .burgerInner::after {
  background: #000;
}

Эффект «крест» с вращением

.burger-cross.active .burgerInner {
  transform: rotate(45deg);
}

.burger-cross.active .burgerInner::before {
  transform: rotate(-90deg) translate(-10px, 0);
  opacity: 1;
}

Чек-лист: 6 пунктов для проверки работоспособности гамбургер-меню

Чтобы убедиться, что меню работает корректно на всех устройствах, пройдите по этому чек-листу после вёрстки:

  • Клик по кнопке — при нажатии на гамбургер три полоски превращаются в крестик (класс .active добавляется). Проверьте на реальном смартфоне или в эмуляторе. Для отладки используйте @keyframes — это помогает синхронизировать анимацию с событиями.
  • Плавность анимации — все трансформации должны длиться 0.15 секунды (значение transition). Если меню дёргается, увеличьте время до 0.3s. CSS-анимация через transition не нагружает процессор, в отличие от JS-циклов, поэтому при 60 кадрах в секунду она остаётся плавной.
  • Адаптивность — на экранах шире 768px гамбургер скрыт (display: none), а меню отображается горизонтально. На мобильных — наоборот.
  • Доступность — добавьте атрибут aria-label="Открыть меню" на кнопку и role="button" для скринридеров.
  • Отсутствие багов с z-index — убедитесь, что меню не перекрывается другими элементами (шапка, слайдер). Установите z-index: 1000 для контейнера .burger. В сложных макетах (аккордеон, карусель) z-index конфликтует чаще — проверяйте иерархию.
  • Тест на touch-устройствах — на iOS и Android кнопка не должна срабатывать дважды из-за эмуляции hover. Используйте @media (hover: none) для отключения эффекта :hover на мобильных.

Типичные ошибки при создании гамбургер-меню (и как их исправить)

Ошибка Что происходит Как исправить
Полоски не центрируются Верхняя и нижняя полоски смещены относительно средней, меню выглядит криво. Проверьте значения top у ::before и ::after. Для .burgerInner высота 4px, шаг между полосками — 10px. Формула: top: -10px для верхней, bottom: -10px для нижней (или top: 10px и top: 20px в слайдере).
Анимация ломается на мобильных При клике крестик формируется рывками, полоски «прыгают». Добавьте will-change: transform к .burgerInner и его псевдоэлементам. Это задействует GPU-ускорение. Если используете @keyframes, убедитесь, что ключевые кадры заданы без резких скачков — иначе браузер пересчитывает позиции медленнее.
Меню не раскрывается после клика Кнопка анимируется, но список ссылок остаётся скрытым. Убедитесь, что в JavaScript используется classList.toggle('active') для обоих элементов: и для кнопки, и для <ul class="menu">. Пример: document.getElementById('menu').classList.toggle('active');
Гамбургер виден на десктопе На широких экранах кнопка отображается вместе с горизонтальным меню. В медиазапросе @media (min-width: 768px) задайте .burger { display: none; } и .menu { display: flex; }. Убедитесь, что специфичность селекторов достаточна. Для реактивных эффектов (hover/focus) на десктопе можно добавить pointer-events: none для скрытой кнопки.

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

Нужен ли JavaScript для создания анимированного гамбургер-меню?

18:31

Нет, для базовой анимации открытия и превращения в крестик достаточно чистого CSS с псевдоэлементами ::before и ::after и свойством transition. JavaScript потребуется только для обработки клика, чтобы переключать класс активности (например, .is-active), который запускает анимацию.

18:43

Почему в коде используются псевдоэлементы ::before и ::after вместо отдельных тегов span?

19:30

Псевдоэлементы позволяют создать три полоски (верхнюю, среднюю и нижнюю) внутри одного элемента .burgerInner, что делает HTML-структуру чище и уменьшает количество DOM-узлов. Это улучшает производительность и упрощает анимацию вращения для формирования крестика.

19:32

Как адаптировать гамбургер-меню под разные размеры экранов?

20:47

Добавьте CSS-медиазапросы, чтобы скрывать стандартное горизонтальное меню на мобильных устройствах (например, @media (max-width: 768px)) и показывать только кнопку-гамбургер. Саму иконку можно масштабировать через width и height контейнера .burgerBox, сохраняя пропорции.

20:50

Почему transition работает медленно или дёргано при анимации?

21:53

Частая причина — анимация свойств, которые вызывают перерасчёт геометрии (например, height или margin). Используйте только transform и opacity для плавности, так как они обрабатываются GPU. Также убедитесь, что свойство transition задано для правильных селекторов.

22:11

Можно ли сделать гамбургер-меню доступным для людей с ограниченными возможностями?

23:23

Да, добавьте атрибуты role='button' и aria-label='Открыть меню' на контейнер .burger, а также используйте свойство outline для видимого фокуса при навигации с клавиатуры. При открытии меню меняйте aria-expanded на true для корректной работы скринридеров.

23:46
Ow
Имя:
Комментарий:
6 комментариев
Больше года назад

Подскажите, а анимация при наведении на гамбургер — это лучше через transition делать или через @keyframes? А то я пробовала, но на телефоне подлагивает иногда.

Ответить
Посмотреть ответы Скрыть ответы
Имя:
Owebs
Больше года назад

Марина

Здравствуйте, Марина! Для плавного изменения стилей при hover/focus/click по гамбургер-меню мы рекомендуем использовать CSS transition. CSS animation c @keyframes — более мощный инструмент для сложных многошаговых сценариев, как, например, аккордеон или слайдер. Transition работает легче и не грузит процессор так, как JS-анимации, поэтому именно он даст вам плавное изменение без подлагиваний на мобильных устройствах.

Ответить
Имя:
Больше года назад

А чем ваша анимация на css лучше, чем если я на js напишу? У меня уже есть готовый скрипт, но он тормозит на старом айфоне.

Ответить
Посмотреть ответы Скрыть ответы
Имя:
Owebs
Больше года назад

Игорёк

Игорь, отличный вопрос! Главное преимущество в производительности: CSS-анимации обрабатываются напрямую видеокартой и не блокируют основной поток, как JavaScript. В тематическом исследовании мы видим, что CSS не грузит CPU так, как JS — особенно на старых устройствах. Для реактивных эффектов вроде hover/focus/click это даёт плавное изменение стилей без задержек. Ваш скрипт может работать, но CSS transition или animation будут заметно быстрее на слабых процессорах.

Ответить
Имя:
Больше года назад

Здравствуйте! Сделала меню как у вас, но при клике на гамбургер оно раскрывается рывками. Может, я что-то путаю с CSS animation и transition? Подскажите, плиз.

Ответить
Посмотреть ответы Скрыть ответы
Имя:
Owebs
Больше года назад

Елена_Веб

Здравствуйте, Елена! Скорее всего, вы используете CSS animation с @keyframes для плавного появления меню, но забыли задать длительность и easing. Для такого сценария, как раскрытие гамбургера, лучше подходит CSS transition — он проще и предсказуемее при клике. Попробуйте заменить анимацию на свойство transition для высоты или трансформации блока. Если это сложный многоэтапный сценарий (как аккордеон или слайдер), то @keyframes оправдан, но для простого выезжания меню — transition будет плавнее и не создаст рывков.

Ответить
Имя:
Развернуть все Скрыть

Популярные

Анимированный индикатор для пунктов меню на сайте
Просмотры 999
Рейтинг 15
8 декабря
7 месяцев назад

Расскажем как написать анимированный индикатор для пунктов меню на сайте. Так портал станет более интерактивным и привлекательным для пользователей.

Как оформить блок акции через CSS в 2025: Зачеркнутая цена + эффектная скидка за 5 минут
Просмотры 1797
Рейтинг 6
14 октября
8 месяцев назад

В данном уроке будем стилизовать текст для объявлений об акции. Необходимо сделать так, чтобы наше объявление привлекло потенциальных покупателей

Создание сайтов через нейросети: плюсы и минусы
Просмотры 1409
Рейтинг 4
9 февраля 2025
Больше года назад

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

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

Оставьте заявку

Поставив галочку, Вы даете согласие на обработку ваших Персональных данных

Услуги

Разработка сайта
  • Анализ ниши и конкурентов
  • Создание структуры и прототипа
  • Дизайн с адаптацией под мобильные
  • Верстка на чистом коде или CMS
  • Настройка форм обратной связи
  • Подключение аналитики и метрик
  • SEO-базовая оптимизация страниц
  • Тестирование и запуск на хостинге
Контент и функциональность
  • Аудит текущего контента и функциональности сайта
  • Разработка контент-стратегии с учётом бизнес-целей
  • Оптимизация структуры навигации и пользовательских путей
  • Создание и редизайн ключевых страниц ( landing, каталоги, о нас, услуги )
  • Интеграция интерактивных элементов (формы, чаты, калькуляторы, фильтры)
  • Настройка SEO-оптимизации контента и технической функциональности
  • Тестирование UX/UI на удобство, скорость и вовлечённость
  • Мониторинг и корректировка контента и функций по аналитике