背景

Ballpit

可互動的物理彈跳球池,重力、牆面與球球碰撞皆以 canvas 2D 即時模擬。

以 canvas 2D 手寫的物理球池:重力落下、牆面反彈、球與球互相碰撞,滑鼠移動還能撥開附近的球。

把這個效果裝進你的專案

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

npx webberui@latest add ballpit

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

Playground

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

40
12
34
900
0.82
編輯中的呼叫預設屬性
<Ballpit/>

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

安裝

npx webberui@latest add https://webberui.com/r/ballpit.json

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

使用

球池會填滿父容器,請放進一個有明確高度且 overflow-hidden 的有界框裡:

import { Ballpit } from "@/components/ui/ballpit";

<div className="relative h-[360px] w-full overflow-hidden rounded-xl">
  <Ballpit count={48} />
</div>

Props

Prop型別預設值說明
countnumber40球的數量
minSizenumber12球半徑下限(px)
maxSizenumber34球半徑上限(px)
gravitynumber900重力加速度(px/s²);設 0 則無重力漂浮
restitutionnumber0.82碰撞後速度保留比例(0~1)
colorsstring[]內建 5 色球體配色,循環套用
interactivebooleantrue滑鼠是否推開附近球體
pointerRadiusnumber110滑鼠推力作用半徑(px)

可及性

  • 使用者系統開啟「減少動態效果」時,球池只擺好初始位置並靜止不動
  • canvas 為純裝飾層,標記 aria-hidden 且不吃指標事件,不干擾鍵盤與螢幕閱讀器
  • 元件自足於父容器尺寸,透過 ResizeObserver 隨容器縮放,離場時會清理動畫迴圈