WebberUI

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.jsonfiles[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 />;

受控用法:傳入 valueonValueChange

const [value, setValue] = React.useState(50);

<ElasticSlider value={value} onValueChange={setValue} />;

Props

Prop型別預設值說明
defaultValuenumber50非受控初始值
valuenumber受控值;提供時由外部狀態驅動
onValueChange(value: number) => void值變動回呼(拖曳/鍵盤/點擊皆觸發)
minnumber0最小值
maxnumber100最大值
stepnumber1級距;設 0 為連續值
leftIconReact.ReactNode<Minus />左側(減少端)圖示
rightIconReact.ReactNode<Plus />右側(增加端)圖示
showValuebooleanfalse是否顯示目前數值
maxOverflownumber50拉過邊界的最大溢出量(px),越大越有彈性
classNamestring透傳至最外層容器

可及性

  • 容器帶 role="slider"aria-valuemin / aria-valuemax / aria-valuenow,可聚焦
  • 支援鍵盤:方向鍵調整一個級距,Home / End 跳至最小/最大值
  • 使用者系統開啟「減少動態效果」時,停用拉伸與回彈的彈簧動畫,僅保留即時取值

On this page