Dưới đây là mẫu hamburger menu mang phong cách hiện đại với các micro-interaction (tương tác vi mô) được chăm chút tỉ mỉ. Khi được click, 3 đường kẻ ngang sẽ biến đổi mượt mà thành chữ “X”, cung cấp phản hồi trực quan và sinh động cho người dùng.
Hiệu ứng animation này được xây dựng trên một cấu trúc HTML, CSS và JavaScript vô cùng tối giản.
<!-- 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;
}
/* Style cho trạng thái active (mở rộng) */
.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() {
// Chuyển đổi class active
this.classList.toggle('active');
// Hỗ trợ trợ năng (cập nhật aria-expanded)
const isExpanded = this.classList.contains('active');
this.setAttribute('aria-expanded', isExpanded);
}); cubic-bezier, chuyển động của menu trở nên mượt mà và thực tế hơn nhiều so với các hiệu ứng cơ bản (ease/linear).aria-label và aria-expanded được cập nhật linh hoạt, giúp các trình đọc màn hình (screen reader) có thể thông báo chính xác trạng thái đóng/mở của menu. Ngoài ra, :focus-visible cũng được thêm vào để làm nổi bật focus ring khi người dùng thao tác bằng bàn phím.transform và opacity. Điều này giúp tránh việc trình duyệt phải tính toán lại layout (reflow/repaint), từ đó duy trì hiệu suất mượt mà nhất.