WebberUI

Card Swap

卡片以佈局動畫互換位置與堆疊,前排卡片沿弧線繞回最後方,形成會呼吸的 3D 牌堆。

一疊帶 3D 透視的卡片,前排卡片會沿弧線落下再繞回最後方,其餘卡片同步遞補向前,形成連續循環的堆疊互換效果。

載入預覽⋯

Playground

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

2800
44
44
0
4
<CardSwap />

安裝

npx shadcn@latest add https://webberui.com/r/card-swap.json

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

安裝依賴後,從 registry JSON(/r/card-swap.jsonfiles[0].content)複製 card-swap.tsx 原始碼到你的 components/ui/ 目錄:

npm install motion clsx tailwind-merge lucide-react

使用

每個直接子節點就是一張卡片,元件會自動堆疊並輪播。

import { CardSwap } from "@/components/ui/card-swap";

<CardSwap interval={2800}>
  <div className="p-6">第一張</div>
  <div className="p-6">第二張</div>
  <div className="p-6">第三張</div>
</CardSwap>

interval 設為 0 可關閉自動輪播,只保留點擊互換(clickToSwap)。

Props

Prop型別預設值說明
childrenReact.ReactNode每個直接子節點是一張卡,建議 2–6 張
intervalnumber2800自動輪播間隔(毫秒),設 0 關閉
offsetXnumber44每往後一層的水平位移(px)
offsetYnumber44每往後一層的垂直位移(px)
scaleStepnumber0.07每往後一層縮小的比例
depthStepnumber60每往後一層在 Z 軸後退的距離(px)
rotateStepnumber0每往後一層附加的旋轉角度(deg)
maxVisiblenumber4最多同時可見的層數,超出的卡片淡出
direction"up" | "down""up"堆疊生長方向
perspectivenumber12003D 透視距離(px),越小透視越強
pauseOnHoverbooleantrue滑鼠移入時暫停輪播
clickToSwapbooleantrue點擊卡片即前進到下一張
cardClassNamestring套用到每張卡片外框的樣式(含尺寸)

可及性

  • 使用者系統開啟「減少動態效果」時,停止自動輪播並靜態呈現整疊卡片
  • 隨機無關、以 mounted 兩段式渲染避免 SSR hydration 不一致
  • 動畫僅使用 CSS 3D transform,離開元件時清除計時器

On this page