狀態與回饋系統

彈簧進度條

以彈簧補間的線性進度條:百分比數字逐位滾動,支援不確定進度掃光與緩衝層,達成 100% 時脈衝一次並顯示勾。

一條會「彈」的線性進度條。進度變化時指示條以 spring 補間到新位置,右側百分比逐位滾動;不知道總量時切到不確定模式,一段 40% 寬的光條在軌道上來回掃動;影片或串流情境可以加上同色淺一階的緩衝層。進度由未滿變為滿的那一刻,整條軌道脈衝一次、右側文字交叉淡接成勾,並呼叫 onComplete。

把這個效果裝進你的專案

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

npx webberui@latest add progress-bar

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

Playground

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

42
120
編輯中的呼叫預設屬性
<ProgressBar/>

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

安裝

npx webberui@latest add https://webberui.com/r/progress-bar.json

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

使用

import { ProgressBar } from "@/components/ui/progress-bar";

<ProgressBar
  value={uploaded}
  max={total}
  label="設計稿-v3.fig"
  showLabel
  onComplete={() => console.log("上傳完成")}
/>

{/* 不確定進度 */}
<ProgressBar indeterminate label="備份封存.zip" />

{/* 影片播放+緩衝 */}
<ProgressBar value={played} buffer={buffered} size="sm" />

Props

Prop型別預設值說明
valuenumber | null0目前進度(0..max,超出會 clamp);傳 null 視為不確定進度
maxnumber100進度上限
indeterminatebooleanfalse不確定進度模式:顯示來回掃光,並省略 aria-valuenow
buffernumber—緩衝進度(0..max),以同色 40% 不透明的第二層條呈現
showLabelbooleanfalse是否在軌道右側顯示百分比
labelReactNode—左上角的標籤文字(例如檔名),同時作為 progressbar 的可及名稱
formatLabel(percent: number) => string—自訂百分比文字;提供時改以純文字顯示,不做逐位滾動
size"sm" | "md" | "lg""md"軌道高度:sm 4px、md 8px、lg 12px
colorstring—指示條顏色;未提供時使用 --wb-progress-bar-color(再退回 neutral 色階)
stiffnessnumber120寬度與數字補間的 spring 剛性
dampingnumber20寬度與數字補間的 spring 阻尼
showCompletebooleantrue達成 100% 時是否脈衝一次並把右側文字換成勾
onComplete() => void—進度由未滿變為滿時呼叫(降回後再滿可再次觸發)
classNamestring—透傳到最外層容器

細節

  • 指示條用 scaleX(transform-origin: left)而不是 width 做動畫,補間過程不會觸發版面重排。
  • 數字滾動:百分比的每一位是一個高 1em、overflow: hidden 的欄,內放 0–9 直列,以 spring 的 y 移到目標位;位數增減(9% → 10%、99% → 100%)時新位淡入,tabular-nums 讓寬度不跳動。
  • 不確定模式的光條寬 40%,以 1.4 秒 easeInOut 在軌道上來回掃動。
  • 完成脈衝只在「未滿 → 滿」時觸發一次;初次掛載就是滿的不會脈衝,降回後再滿則會再次觸發。
  • 顏色:設定全域 CSS 變數 --wb-progress-bar-color 即可統一換色,color prop 會覆寫它;緩衝層的過渡長度讀取根元素上的 --wb-progress-bar-duration(預設 300ms)。

可及性

  • 根元素為 role="progressbar",帶 aria-valuemin、aria-valuemax、aria-valuenow 與 aria-valuetext(例如「已完成 42%」);不確定模式省略 aria-valuenow,aria-valuetext 改為「處理中」並設定 aria-busy
  • 有 label 時以 aria-labelledby 指向標籤;沒有時退回 aria-label="進度"
  • 逐位滾動的數字與勾號對輔助科技隱藏,朗讀內容以 aria-valuetext 為準
  • 使用者系統開啟「減少動態效果」時:指示條直接到位不做 spring、數字直接替換、不確定模式改為靜態 40% 條緩慢明暗呼吸並顯示「處理中」文字、完成時不脈衝只顯示勾