Magnetic Button
磁吸按鈕:游標靠近時被吸向游標偏移,內層文字視差、離開後 spring 回彈。
載入預覽⋯
Playground
即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。
0.35
<MagneticButton />
安裝
npx shadcn@latest add https://webberui.com/r/magnetic-button.json安裝時會一併寫入 --wb-duration-fast CSS 變數到你的全域樣式。
安裝依賴後,複製 magnetic-button.tsx 到你的 components/ui/ 目錄,並在全域 CSS 加入:
npm install motion clsx tailwind-merge:root {
--wb-duration-fast: 200ms;
}使用
import { MagneticButton } from "@/components/ui/magnetic-button";
<MagneticButton onClick={() => console.log("clicked")}>
開始使用
</MagneticButton>Props
| Prop | 型別 | 預設值 | 說明 |
|---|---|---|---|
strength | number | 0.35 | 磁吸強度:按鈕偏移量 = 游標相對中心距離 × strength,0 表示完全不動 |
springConfig | SpringOptions | { stiffness: 260, damping: 18, mass: 0.7 } | 離開後回彈的 spring 參數 |
className | string | — | 覆蓋預設樣式(預設為實心按鈕,可改為外框等變體) |
children | ReactNode | — | 按鈕內容 |
其餘 <button> 屬性(onClick、disabled、aria-* 等)皆直接透傳。
細節
- 視差深度:按鈕朝游標偏移時,內層文字反向偏移一半,產生兩層深度感
- spring 回彈:以
useMotionValue+useSpring驅動,游標離開後帶慣性彈回原位 - 觸控裝置自動停用:僅回應滑鼠的 pointer 事件(
pointerType === "mouse"),觸控時就是一顆普通按鈕 - 使用者系統開啟「減少動態效果」時停用磁吸,按鈕保持原位、功能不受影響
disabled時同步停用磁吸