WebberUI

Skeleton Orchestra

骨架屏交響系統:載入完成時,骨架依版面位置以方向性波次逐一實體化為真實內容。

載入預覽⋯

Playground

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

0.1
<SkeletonOrchestra />

安裝

npx shadcn@latest add https://webberui.com/r/skeleton-orchestra.json

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

安裝依賴後,開啟 skeleton-orchestra.json,將 files[0].content 的內容存成你的 components/ui/skeleton-orchestra.tsx

npm install motion clsx tailwind-merge

使用

import {
  SkeletonOrchestra,
  SkeletonSlot,
} from "@/components/ui/skeleton-orchestra";

<SkeletonOrchestra loading={isLoading} stagger={0.1} className="space-y-4">
  <SkeletonSlot
    skeleton={
      <div className="size-10 rounded-full bg-neutral-200 dark:bg-neutral-800" />
    }
  >
    <Avatar />
  </SkeletonSlot>
  <SkeletonSlot>
    <h3>文章標題</h3>
  </SkeletonSlot>
  <SkeletonSlot>
    <p>正文內容,預設骨架會依此內容的尺寸畫圓角灰塊。</p>
  </SkeletonSlot>
  <SkeletonSlot index={9}>
    <p>指定 index 讓這段內容壓軸實體化。</p>
  </SkeletonSlot>
</SkeletonOrchestra>;

Props

SkeletonOrchestra

Prop型別預設值說明
loadingboolean是否處於載入狀態;由 true 轉為 false 時觸發波次實體化
staggernumber0.1相鄰波次的間隔(秒)
childrenReact.ReactNode放入含 SkeletonSlot 的版面內容
classNamestring附加到容器的 class

SkeletonSlot

Prop型別預設值說明
indexnumber手動指定波次序(0 起算);未指定時依 Slot 的掛載順序自動編號
skeletonReact.ReactNode自訂骨架形狀(如圓形頭像);未指定時依 children 尺寸畫圓角灰塊
childrenReact.ReactNode真實內容
classNamestring附加到 Slot 外層的 class

細節

  • 波次順序:未指定 index 時,依 Slot 的掛載順序(即 DOM 順序,通常是左上到右下)自動編號;每格延遲 = 波次序 × stagger,形成方向性波次
  • 同構骨架:預設骨架以隱形佔位渲染真實內容取得尺寸,灰塊與最終版面同構,實體化時不會跳版
  • 交叉過渡:以 AnimatePresence mode="popLayout" 讓骨架淡出縮小、內容以 scale/opacity 浮現,兩者交叉進行、逐格實體化
  • 回到載入loading 轉回 true 時骨架立即接手,不套波次延遲
  • 減少動態效果:使用者系統開啟「減少動態效果」時,無波次、無縮放,骨架與內容直接切換,脈動動畫也一併停用;首次渲染仍與 SSR 輸出一致
  • 可及性:容器帶 aria-busy,骨架區塊為 aria-hidden,輔助科技只會讀到真實內容

On this page