Frontend Lab
← 回到所有模式
PC08🧭 Navigation · 導航選單

Mega Menu

大選單

難度 ★★★★★標籤 mega · panel · header3 min read

模式簡述

Mega Menu:頂部 nav hover 後展開的大型分類面板。電商、企業官網的標配。可以放圖文、CTA、推薦。

關閉|預設關閉

Claude Code Prompt

💬 Claude Code Prompt
參考:PC08 mega-menu
組件:MegaMenu.tsx

Mega Menu:頂部 nav hover 後展開的大型分類面板。電商、企業官網的標配。可以放圖文、CTA、推薦。

限制:
- hover delay 太短
- 面板高度沒固定
- 鍵盤導航斷掉

完整程式碼

MegaMenu.tsx
"use client";
import { useEffect, useState } from "react";
import { ChevronDown, Sparkles, Zap, Layers, Image } from "lucide-react";

type State = "closed" | "open";

const SECTIONS = [
{ icon: Sparkles, title: "視覺效果", desc: "Framer / GSAP / Three.js" },
{ icon: Zap, title: "互動模式", desc: "Search / Modal / Carousel" },
{ icon: Layers, title: "Apple 系列", desc: "iOS 風格組件" },
{ icon: Image, title: "視差與滾動", desc: "Scrollytelling 範本" },
];

export function MegaMenu({ state = "closed" }: { state?: State }) {
const [open, setOpen] = useState(state === "open");
useEffect(() => setOpen(state === "open"), [state]);

return (
  <div className="relative w-full max-w-lg">
    <nav className="flex items-center gap-4 border-b border-border px-3 py-2 text-xs">
      <span className="font-medium">Lab</span>
      <button
        onMouseEnter={() => setOpen(true)}
        onClick={() => setOpen((o) => !o)}
        className="inline-flex items-center gap-1 hover:text-lab-accent"
      >
        產品 <ChevronDown className="h-3 w-3" />
      </button>
      <a className="hover:text-lab-accent">定價</a>
      <a className="hover:text-lab-accent">文件</a>
    </nav>
    {open && (
      <div
        onMouseLeave={() => setOpen(false)}
        className="absolute inset-x-0 top-full z-10 mt-1 rounded-lg border border-border bg-background p-4 shadow-2xl animate-in fade-in slide-in-from-top-2 duration-150"
      >
        <div className="grid grid-cols-2 gap-3">
          {SECTIONS.map((s, i) => (
            <a
              key={i}
              className="flex gap-3 rounded-md p-2 hover:bg-lab-accent/5"
            >
              <s.icon className="mt-0.5 h-4 w-4 text-lab-accent" />
              <div>
                <p className="text-xs font-medium text-foreground">{s.title}</p>
                <p className="text-[11px] text-muted-foreground">{s.desc}</p>
              </div>
            </a>
          ))}
        </div>
      </div>
    )}
  </div>
);
}

何時用

  • ✅ 電商分類超過兩層
  • ✅ 企業官網的產品線展示
  • ✅ 需要在 nav 直接導購的內容站

何時別用

  • ❌ 產品線少於 10 項(用普通 dropdown)
  • ❌ 手機優先(mega 在手機上要拆掉)
  • ❌ 極簡風格網站(會破壞調性)

我踩過的坑

  1. hover delay 太短:滑鼠掠過時亂跳。300-500ms 才觸發。

  2. 面板高度沒固定:不同 menu 高度不一,整頁 jitter。固定一個最大高度。

  3. 鍵盤導航斷掉:tab 進不去面板內部,accessibility 死。記得做 roving tabindex。

相關模式

  • PB07
  • PC03

搜尋

按 ⌘K 隨時開啟