PC08▸🧭 Navigation · 導航▸選單
Mega Menu
大選單
難度 ★★★★★標籤 mega · panel · header3 min read
模式簡述
Mega Menu:頂部 nav hover 後展開的大型分類面板。電商、企業官網的標配。可以放圖文、CTA、推薦。
Claude Code Prompt
參考:PC08 mega-menu 組件:MegaMenu.tsx Mega Menu:頂部 nav hover 後展開的大型分類面板。電商、企業官網的標配。可以放圖文、CTA、推薦。 限制: - hover delay 太短 - 面板高度沒固定 - 鍵盤導航斷掉
完整程式碼
"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 在手機上要拆掉)
- ❌ 極簡風格網站(會破壞調性)
我踩過的坑
-
hover delay 太短:滑鼠掠過時亂跳。300-500ms 才觸發。
-
面板高度沒固定:不同 menu 高度不一,整頁 jitter。固定一個最大高度。
-
鍵盤導航斷掉:tab 進不去面板內部,accessibility 死。記得做 roving tabindex。
相關模式
- PB07
- PC03