SnippetUI

Animação para Menu Hambúrguer

Implementação de uma animação elegante e interativa para menu hambúrguer, que se transforma suavemente em um ícone de 'X' ao ser ativada.

HTMLCSSJavaScript

Um exemplo de implementação de menu hambúrguer moderno, enriquecido com microinterações refinadas. Ao clicar, as três linhas horizontais transformam-se de forma fluida em um “X”, fornecendo um feedback visual intuitivo ao usuário.

Código de Implementação

Esta animação é construída sobre uma base simples de HTML, CSS e 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;
}

/* Estilo do estado ativo (expandido) */
.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() {
  // Alternar a classe active
  this.classList.toggle('active');
  
  // Suporte à acessibilidade (atualização de aria-expanded)
  const isExpanded = this.classList.contains('active');
  this.setAttribute('aria-expanded', isExpanded);
});

Recursos e Explicação

  • Animação Fluida: A utilização da função de timing cubic-bezier garante uma transição suave e orgânica, evitando movimentos bruscos ou mecânicos.
  • Acessibilidade (a11y): Os atributos aria-label e aria-expanded são aplicados corretamente para informar os leitores de tela sobre o estado do menu (aberto ou fechado). Adicionalmente, :focus-visible é implementado para destacar o anel de foco, facilitando a navegação via teclado.
  • Alta Performance: Por depender exclusivamente das propriedades transform e opacity na animação, minimizam-se as operações de reflow e repaint do navegador, garantindo uma performance excepcional.