WebberUI

Image Trail Card

游標移動時沿路徑留下淡出圖片殘影軌跡的互動卡片,支援原地淡出與飄移兩款動畫。

載入預覽⋯

Playground

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

120
60
0.9
8
<ImageTrailCard />

安裝

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

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

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

npm install motion clsx tailwind-merge

使用

import { ImageTrailCard } from "@/components/ui/image-trail-card";

<ImageTrailCard
  images={[
    "/gallery/01.jpg",
    "/gallery/02.jpg",
    "/gallery/03.jpg",
    { src: "/gallery/04.jpg", alt: "作品四" },
  ]}
  className="aspect-[3/2] w-full max-w-md"
>
  <p className="text-sm text-neutral-500">移動游標</p>
</ImageTrailCard>

images 可傳字串網址,或帶 alt 的物件。清單會依游標位移循環取用,數量不足時自動重複補齊,因此少量圖片也能形成連續軌跡。

款式

  • fade(預設):殘影在原地淡出並輕微縮放。
  • drift:殘影淡出時額外向上飄移,軌跡更有流動感。
<ImageTrailCard images={images} variant="drift" />

Props

Prop型別預設值說明
imagesArray<string | { src: string; alt?: string }>殘影圖片來源清單,游標移動時依序循環取用
variant"fade" | "drift""fade"殘影款式:原地淡出或淡出時向上飄移
imageSizenumber120單張殘影的邊長(px)
thresholdnumber60生成下一張殘影所需的最小游標位移(px),越小軌跡越密
lifetimenumber0.9單張殘影從出現到消失的存活時間(秒)
rotatenumber8每張殘影隨機旋轉的最大角度(deg),設 0 則不旋轉
childrenReact.ReactNode置於殘影層下方的基礎內容(標題、提示文字等)
classNamestring附加到最外層容器的 class(建議在此設定尺寸與長寬比)

其餘 <div> 屬性(如 aria-labelstyle)會透傳到最外層容器;onPointerMoveonPointerLeave 會在內部處理後續呼叫。

細節

  • 殘影以固定節點池搭配 Motion 的命令式 animate 驅動,游標移動期間直接寫入 DOM 座標與 transform,不觸發 React re-render,高頻移動也維持流暢。
  • 節點池數量會依 images 長度自動補齊至至少 12、上限 30,避免殘影過早被回收或 DOM 無限增長。
  • 以「累積位移超過 threshold 才生成下一張」控制軌跡密度,而非每次 pointermove 都生成。
  • children 位於殘影層下方作為卡片基礎內容,並設為 pointer-events-none,不干擾游標追蹤。

可及性

  • 使用者系統開啟「減少動態效果」時,停用殘影生成,卡片維持為靜態容器,children 內容照常顯示。
  • 殘影層標記 aria-hidden、圖片預設 alt="",視為純裝飾,不會對輔助科技造成朗讀噪音。
  • 元件卸載時會停止所有進行中的殘影動畫,清理計時中的動畫控制。

On this page