Анимация гамбургер-меню
Реализация красивой и интерактивной анимации гамбургер-меню, которое плавно превращается в значок «X» при клике.
HTMLCSSJavaScript
Пример реализации современного гамбургер-меню с продуманной микроинтеракцией. При клике три линии плавно трансформируются в «X», обеспечивая пользователю интуитивно понятную обратную связь.
Код реализации
Эта анимация работает благодаря простой структуре на HTML, CSS и JavaScript.
<!-- HTML -->
<button class="hamburger-menu" aria-label="Menu" aria-expanded="false">
<span class="line line-1"></span>
<span class="line line-2"></span>
<span class="line line-3"></span>
</button>/* CSS */
.hamburger-menu {
display: flex;
flex-direction: column;
justify-content: space-between;
width: 48px;
height: 32px;
background: transparent;
border: none;
cursor: pointer;
padding: 0;
position: relative;
transition: transform 0.3s ease;
}
.hamburger-menu:focus-visible {
outline: 2px solid #3b82f6;
outline-offset: 6px;
border-radius: 4px;
}
.hamburger-menu:hover {
transform: scale(1.05);
}
.hamburger-menu .line {
display: block;
width: 100%;
height: 4px;
background-color: #1e293b;
border-radius: 9999px;
transition: all 0.5s cubic-bezier(0.4, 0, 0.2, 1);
transform-origin: center;
}
/* Стили активного (раскрытого) состояния */
.hamburger-menu.active .line-1 {
transform: translateY(14px) rotate(45deg);
background-color: #ef4444;
}
.hamburger-menu.active .line-2 {
opacity: 0;
transform: translateX(-20px);
}
.hamburger-menu.active .line-3 {
transform: translateY(-14px) rotate(-45deg);
background-color: #ef4444;
}// JavaScript
const hamburger = document.querySelector('.hamburger-menu');
hamburger.addEventListener('click', function() {
// Переключение класса active
this.classList.toggle('active');
// Поддержка доступности (обновление aria-expanded)
const isExpanded = this.classList.contains('active');
this.setAttribute('aria-expanded', isExpanded);
}); Особенности и пояснения
- Плавная анимация: Использование функции смягчения `cubic-bezier` делает анимацию более естественной и плавной, лишая её механистичности.
- Доступность (a11y): Атрибуты `aria-label
и \aria-expandedкорректно настроены для передачи состояния открытия/закрытия меню скринридерам. Кроме того, используется \:focus-visible` для четкого отображения кольца фокуса при навигации с клавиатуры. - Производительность: Анимация задействует только `transform
и \opacity`, что сводит к минимуму перерисовки (repaint и reflow) браузером и обеспечивает высокую производительность.