SnippetUI

ハンバーガーメニューのアニメーション

クリック時にスムーズに「X」アイコンに変化する、美しくインタラクティブなハンバーガーメニューのアニメーション実装。

HTMLCSSJavaScript

洗練されたマイクロインタラクションを提供する、モダンなハンバーガーメニューの実装例です。クリック時に3本の線が滑らかに「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` のみを使用しているため、ブラウザの再描画(リペイント・リフロー)を抑え、高いパフォーマンスを維持します。