WebberUI

放射環繞選單

中心按鈕展開環繞排列的放射狀選單,依序彈出。

點擊中心的 FAB 主按鈕,子項沿圓弧以 spring 依序彈出、角度自動均分,再點一下反向收回;子項在滑鼠懸停或鍵盤聚焦時顯示朝外的標籤,可透過 radiusarcstartAngle 自訂軌道半徑與展開弧形,適合行動端快速動作或儀表板工具入口。

載入預覽⋯

Playground

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

96
360
90
0.05
<RadialOrbitMenu />

安裝

npx shadcn@latest add https://webberui.com/r/radial-orbit-menu.json

或在 components.json 設定 registries 後,改用 @webberui/radial-orbit-menu 安裝。

安裝依賴後,從 registry JSON(/r/radial-orbit-menu.jsonfiles[0].content)複製 radial-orbit-menu.tsx 原始碼到你的 components/ui/ 目錄:

npm install motion lucide-react clsx tailwind-merge

使用

import { RadialOrbitMenu } from "@/components/ui/radial-orbit-menu";
import { Calendar, Mail, Search } from "lucide-react";

<RadialOrbitMenu
  radius={96}
  items={[
    { icon: <Mail />, label: "撰寫郵件", onClick: () => console.log("mail") },
    { icon: <Calendar />, label: "新增行程" },
    { icon: <Search />, label: "搜尋" },
  ]}
/>

只展開上半部弧形時,設定 arcstartAngle

<RadialOrbitMenu items={items} radius={110} arc={180} startAngle={0} />

Props

Prop型別預設值說明
itemsRadialOrbitMenuItem[]子項清單,每項含 icon(圖示)、label(標籤)、onClick?(點擊回呼)
radiusnumber96子項中心到主按鈕中心的距離(px)
arcnumber360展開的弧形範圍(度),360 為完整圓,小於 360 時首尾子項各佔端點
startAnglenumber90第一個子項的起始角度(度),0 為正右方、90 為正上方,逆時針遞增
staggernumber0.05子項依序彈出的間隔(秒)
defaultOpenbooleanfalse初始是否展開(非受控)
onOpenChange(open: boolean) => void展開狀態改變時的回呼
closeOnSelectbooleantrue點擊子項後是否自動收合
triggerLabelstring"開啟快速選單"主按鈕的無障礙標籤
classNamestring透傳到最外層容器

可及性

  • 主按鈕帶 aria-expandedaria-label,展開狀態對輔助科技可見
  • 子項皆為原生 button 並帶 aria-label,鍵盤 Tab 聚焦時同樣顯示標籤
  • 按下 Escape 收合並將焦點還給主按鈕;點擊選單外部也會收合
  • 使用者系統開啟「減少動態效果」時,子項直接在定位淡入淡出,不做彈跳位移與旋轉

On this page