Elastic Slider
把手拉伸帶彈簧物理的滑桿,拖過邊界時軌道會像橡皮筋一樣延展並回彈。
一支帶阻尼物理的滑桿:拖曳到端點外時,軌道會依阻力延展、圖示被把手推開,放手後以彈簧回彈。支援受控/非受控、鍵盤操作與減少動態偏好。
載入預覽⋯
Playground
即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。
100
1
50
<ElasticSlider />
安裝
npx shadcn@latest add https://webberui.com/r/elastic-slider.json或在 components.json 設定 registries 後,改用 @webberui/elastic-slider 安裝。
安裝依賴後,從 registry JSON(/r/elastic-slider.json 的 files[0].content)複製 elastic-slider.tsx 原始碼到你的 components/ui/ 目錄:
npm install motion lucide-react clsx tailwind-merge使用
import { ElasticSlider } from "@/components/ui/elastic-slider";
<ElasticSlider defaultValue={40} showValue />;受控用法:傳入 value 與 onValueChange。
const [value, setValue] = React.useState(50);
<ElasticSlider value={value} onValueChange={setValue} />;Props
| Prop | 型別 | 預設值 | 說明 |
|---|---|---|---|
defaultValue | number | 50 | 非受控初始值 |
value | number | — | 受控值;提供時由外部狀態驅動 |
onValueChange | (value: number) => void | — | 值變動回呼(拖曳/鍵盤/點擊皆觸發) |
min | number | 0 | 最小值 |
max | number | 100 | 最大值 |
step | number | 1 | 級距;設 0 為連續值 |
leftIcon | React.ReactNode | <Minus /> | 左側(減少端)圖示 |
rightIcon | React.ReactNode | <Plus /> | 右側(增加端)圖示 |
showValue | boolean | false | 是否顯示目前數值 |
maxOverflow | number | 50 | 拉過邊界的最大溢出量(px),越大越有彈性 |
className | string | — | 透傳至最外層容器 |
可及性
- 容器帶
role="slider"與aria-valuemin/aria-valuemax/aria-valuenow,可聚焦 - 支援鍵盤:方向鍵調整一個級距,
Home/End跳至最小/最大值 - 使用者系統開啟「減少動態效果」時,停用拉伸與回彈的彈簧動畫,僅保留即時取值