狀態與回饋系統
Logo 描邊載入器
一段短虛線沿 logo 描邊路徑繞行的 React 載入器,完成時收合成完整描邊再淡入填色;預設使用 WebberUI 品牌曲線,可換成自己的 path,也能以全頁疊層顯示。
把品牌標誌變成載入指示。載入中,一段短虛線沿著 logo 的描邊路徑不停繞行,底下襯一條淡淡的完整描邊;isComplete 轉為 true(或 loading 轉為 false)後,虛線向前長成完整描邊,接著淡入填色——開放線沒有填色可言,就改成描邊從中間色轉為主色。整段動畫結束後呼叫一次 onDone。預設路徑是 WebberUI 的品牌曲線,換成自己的 path 與 viewBox 即可套用任何標誌;開啟 fullscreen 會以半透明模糊疊層蓋住整頁,完成後淡出。
把這個效果裝進你的專案
在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。
npx webberui@latest add logo-trace-loaderPlayground
即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。
1.4
7.5
0.35
64
編輯中的呼叫預設屬性
<LogoTraceLoader/>
完整範例包含預覽的排版與資料。先安裝元件,再把範例檔貼入你的專案。
安裝
npx webberui@latest add https://webberui.com/r/logo-trace-loader.json或在 components.json 設定 registries 後,改用 @webberui/logo-trace-loader 安裝。
使用
import { LogoTraceLoader } from "@/components/ui/logo-trace-loader";
const [loading, setLoading] = React.useState(true);
const [done, setDone] = React.useState(false);
// 資料回來時把 isComplete 設為 true,動畫跑完會呼叫 onDone
<LogoTraceLoader
loading={loading}
isComplete={done}
onDone={() => setLoading(false)}
/>
// 換成自己的封閉 path,完成時填色淡入
<LogoTraceLoader
path="M18 8H46A10 10 0 0 1 56 18V46A10 10 0 0 1 46 56H18A10 10 0 0 1 8 46V18A10 10 0 0 1 18 8Z"
fill="rgb(16 185 129 / 0.18)"
strokeWidth={5}
isComplete={done}
/>Props
| Prop | 型別 | 預設值 | 說明 |
|---|---|---|---|
loading | boolean | true | 是否正在載入;轉為 false 時視同完成,開始收合 |
isComplete | boolean | false | 是否已完成;轉為 true 時開始收合成完整描邊再上色 |
path | string | WebberUI 品牌曲線 | 描邊用的 SVG path 字串 |
viewBox | string | "0 0 64 64" | SVG viewBox,需與 path 的座標系一致 |
size | number | 64 | 圖示邊長(px),元素固定寬高避免版面跳動 |
strokeWidth | number | 7.5 | 完成後的描邊粗細(viewBox 單位);loop 階段的淡描邊為其一半 |
loopDurationSeconds | number | 1.4 | 短虛線繞行一圈的秒數 |
fillFadeSeconds | number | 0.35 | 完成時填色(或描邊轉色)淡入的秒數 |
fill | string | "none" | 封閉形 path 的填色;none 時改為描邊轉色 |
fullscreen | boolean | false | 以全頁疊層方式顯示,完成後淡出 |
label | string | "載入中" | 螢幕閱讀器與減少動態效果時顯示的載入文字 |
onDone | () => void | — | 完成動畫全部結束後呼叫一次 |
className | string | — | 透傳到最外層容器 |
細節
- 階段依序是 loop → closingOutline → fadingFill → done。收合固定 360ms(
cubic-bezier(0.23, 1, 0.32, 1)),填色淡入用fillFadeSeconds;切換時點以setTimeout依總時長計算,不依賴animationend,所以元素中途卸載或動畫被打斷都不會漏掉onDone。 - 短虛線畫在
pathLength=1的路徑上,strokeDasharray為0.16 0.84、strokeDashoffset由 0 線性走到 −1,任何形狀都能無縫循環;收合時虛線從當下位置向前長成1 0,不會跳回起點。 - 一開始就是完成狀態(例如
loading={false})時直接顯示最終樣子,不重播收合也不呼叫onDone;loading再轉回true就從 loop 重新開始。 - 顏色變數:
--wb-ltl-color(主色,預設currentColor)、--wb-ltl-track(收合後、上色前的中間色,預設由currentColor混透明推導)、--wb-ltl-ease(描邊轉色的 easing)。用className設文字色即可整組換色。 - 全頁模式是
fixed inset-0 z-50的半透明模糊疊層(bg-white/80、深色bg-neutral-950/80),進出各淡入淡出 200ms。
可及性
- 外層是
role="status"、aria-live="polite"區域,載入中朗讀label,完成時朗讀「載入完成」 - SVG 設為
aria-hidden,動畫本身不會被輔助科技讀出 - 全頁模式的狀態文字放在疊層之外,疊層淡出後完成訊息仍會被朗讀
- 使用者系統開啟「減少動態效果」時不繞行:載入中顯示靜態的完整淡描邊與可見的
label文字,完成時直接顯示最終狀態,並在下一個 tick 呼叫onDone