導航

Pill Nav

作用中項目滑動高亮的極簡藥丸導航。

作用中項目切換時,高亮藥丸以彈簧動態在項目之間平滑滑動,支援圖示、受控/非受控用法與鍵盤操作。

把這個效果裝進你的專案

在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。

npx webberui@latest add pill-nav

還沒有專案,或安裝遇到問題?看快速開始 →

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

380
32
編輯中的呼叫預設屬性
<PillNav/>

完整範例包含預覽的排版與資料。先安裝元件,再把範例檔貼入你的專案。

安裝

npx webberui@latest add https://webberui.com/r/pill-nav.json

或在 components.json 設定 registries 後,改用 @webberui/pill-nav 安裝。

使用

import { Compass, Home, Settings, User } from "lucide-react";
import { PillNav } from "@/components/ui/pill-nav";

<PillNav
  defaultValue="Discover"
  items={[
    { label: "Home", icon: Home },
    { label: "Discover", icon: Compass },
    { label: "Profile", icon: User },
    { label: "Settings", icon: Settings },
  ]}
/>;

作為連結列時,為每個項目加上 href,元件會渲染成 <a>:

<PillNav
  items={[
    { label: "Docs", href: "/docs" },
    { label: "Blog", href: "/blog" },
  ]}
/>

受控用法

以 value 與 onValueChange 接管作用中狀態:

const [tab, setTab] = React.useState("Home");

<PillNav
  value={tab}
  onValueChange={setTab}
  items={[{ label: "Home" }, { label: "Discover" }]}
/>;

Props

Prop型別預設值說明
itemsPillNavItem[]—導航項目清單
defaultValuestring第一項非受控初始作用中項目(label)
valuestring—受控作用中項目(label)
onValueChange(value: string) => void—作用中項目改變時觸發
stiffnessnumber380滑動高亮的彈簧剛性
dampingnumber32滑動高亮的彈簧阻尼

其中 PillNavItem 形狀為 { label: string; href?: string; icon?: LucideIcon }。label 同時作為唯一識別值。

可及性

  • 作用中項目帶 aria-current="page",輔助科技可辨識目前位置
  • 每個項目都是原生 <button> 或 <a>,可用 Tab 聚焦、Enter 觸發,並帶 focus-visible 焦點環
  • 使用者系統開啟「減少動態效果」時,高亮改為瞬間切換、不做滑動動畫

客製

高亮與焦點環顏色以 --wb-* CSS 變數暴露,可用 className 覆寫:

  • --wb-pill-active-bg:作用中藥丸背景
  • --wb-pill-active-fg:作用中文字顏色
  • --wb-pill-ring:focus-visible 焦點環顏色