Navigation Menu
StabilnyGłówna nawigacja witryny z rozbudowanymi, animowanymi panelami — dla stron marketingowych i dokumentacji, w których każda sekcja potrzebuje czegoś więcej niż jednego linku.
Instalacja
$ pnpm dlx shadcn@latest add https://www.prfct.dev/r/navigation-menu.jsonUżycie
import Link from "next/link"
import {
NavigationMenu,
NavigationMenuContent,
NavigationMenuItem,
NavigationMenuLink,
NavigationMenuList,
NavigationMenuTrigger,
navigationMenuTriggerStyle,
} from "@/components/ui/navigation-menu"<NavigationMenu>
<NavigationMenuList>
<NavigationMenuItem>
<NavigationMenuTrigger>Products</NavigationMenuTrigger>
<NavigationMenuContent>
<NavigationMenuLink render={<Link href="/analytics" />}>
Analytics
</NavigationMenuLink>
</NavigationMenuContent>
</NavigationMenuItem>
<NavigationMenuItem>
<NavigationMenuLink
render={<Link href="/pricing" />}
className={navigationMenuTriggerStyle()}
>
Pricing
</NavigationMenuLink>
</NavigationMenuItem>
</NavigationMenuList>
</NavigationMenu>Wszystkie panele dzielą jeden popup. Gdy użytkownik przechodzi od jednego wyzwalacza do kolejnego, popup płynnie dopasowuje się do rozmiaru nowego panelu, a treść wsuwa się z kierunku ruchu — to wyraźna wskazówka przestrzenna, że przegląda elementy tego samego poziomu, a nie otwiera czegoś nowego.
Przykłady
Nawigacja witryny
Łącz wyzwalacze otwierające panele ze zwykłymi linkami ostylowanymi przez navigationMenuTriggerStyle() — dzięki temu każdy element paska wygląda i zachowuje się spójnie.
Linki z ikonami
Dwukolumnowa lista miejsc docelowych, każde z ikoną i jednowierszowym opisem. To opisy robią tu najwięcej: pozwalają wybrać bez przeklikiwania się przez kolejne strony.
Wyróżniona treść
Zarezerwuj boczną kolumnę panelu na jedną aktualną pozycję — premierę, poradnik, wydarzenie. Jedno wyróżnienie na panel; dwa zaczną ze sobą konkurować.
Same linki
Gdy nie ma paneli, menu jest ostylowaną listą linków z wędrującym fokusem (roving focus). Bieżącą sekcję oznacz propem active — ustawia on aria-current="page" i styl aktywnego elementu.
Wytyczne
Kiedy używać
- Jako główna nawigacja stron marketingowych i dokumentacji z kilkoma sekcjami najwyższego poziomu.
- Gdy sekcja potrzebuje drogowskazów — opisów, grupowania albo wyróżnionej pozycji — zanim użytkownik zdecyduje, dokąd przejść.
Kiedy nie używać
- Do nawigacji w aplikacji z wieloma miejscami docelowymi lub głęboką hierarchią — użyj Sidebar.
- Do poleceń i akcji — użyj Dropdown Menu lub Menubar. Menu nawigacyjne zawiera wyłącznie linki.
- Na małych ekranach — poniżej
mdzwiń nawigację do prostej listy w panelu Sheet.
Zawartość panelu
Trzymaj się pięciu–siedmiu pozycji najwyższego poziomu. Każdy link w panelu dostaje krótki tytuł i najlepiej jednowierszowy opis w formie zwykłego zdania — z tą samą interpunkcją w całym panelu. Długie panele podziel na kolumny powiązanych linków i nie chowaj niczego ważnego wyłącznie w panelu — to samo miejsce powinno być osiągalne także z samej strony albo ze stopki.
Najechanie i kliknięcie
Panele otwierają się po kliknięciu oraz po najechaniu, z krótkim opóźnieniem delay (50 ms). Popup i wyzwalacz łączy niewidoczny mostek, więc kursor może przejść po skosie do panelu, nie zamykając go. Nigdy nie umieszczaj celu nawigacji na samym wyzwalaczu — wyzwalacz tylko otwiera swój panel; strona przeglądowa sekcji należy do panelu jako jego pierwszy link.
Dostępność
Navigation Menu renderuje element <nav> z listą pozycji. Wyzwalacze to przyciski z aria-expanded; panele to rozwijana treść, a nie menu — do linków w środku przechodzi się klawiszem Tab, tak samo jak na stronie.
| Klawisz | Działanie |
|---|---|
Tab | Przechodzi między wyzwalaczami i linkami, a także do linków otwartego panelu. |
←→ | Przenosi fokus między wyzwalaczami i linkami najwyższego poziomu. |
EnterSpacja | Otwiera lub zamyka panel wyzwalacza, na którym jest fokus; na linku przechodzi pod jego adres. |
↓ | Na wyzwalaczu otwiera jego panel i przenosi do niego fokus. |
Esc | Zamyka panel i przywraca fokus na jego wyzwalacz. |
- Bieżąca strona. Przekaż
activedo linku bieżącej strony lub sekcji — technologie wspomagające dostaną tę informację jakoaria-current="page". - Nazwij każdą nawigację. Jeśli strona ma więcej niż jeden
<nav>, nadaj każdemuaria-label(Główna, Stopka), aby użytkownicy czytników ekranu mogli je rozróżnić.
Dokumentacja API
NavigationMenu
Główny element <nav>. Przyjmuje wszystkie propsy NavigationMenu.Root z Base UI.
NavigationMenuItem
NavigationMenuTrigger
Otwiera panel swojej pozycji. Renderuje strzałkę, która obraca się, gdy panel jest otwarty. Przyjmuje disabled.
NavigationMenuContent
Panel pozycji. Jego rozmiar ustal, nadając szerokość pierwszemu elementowi potomnemu; popup animuje przejścia między rozmiarami paneli.
NavigationMenuLink
navigationMenuTriggerStyle
Generator klas, dzięki któremu zwykły NavigationMenuLink wygląda dokładnie jak wyzwalacz. Przyjmuje { className }, aby rozszerzyć style.