Zoom Lens
圖片放大鏡,鏡片跟隨游標就地放大,或以側邊面板呈現放大結果。
載入預覽⋯
Playground
即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。
2.5
160
<ZoomLens />
安裝
npx shadcn@latest add https://webberui.com/r/zoom-lens.json或在 components.json 設定 registries 後,改用 @webberui/zoom-lens 安裝。
安裝依賴後,從 registry JSON(/r/zoom-lens.json 的 files[0].content)複製 zoom-lens.tsx 原始碼到你的 components/ui/ 目錄:
npm install motion lucide-react clsx tailwind-merge使用
import { ZoomLens } from "@/components/ui/zoom-lens";
<ZoomLens
src="/product.jpg"
alt="產品細節圖"
className="w-full max-w-md"
/>側邊面板模式
panel variant 會在原圖上標示取景框,並於側邊面板顯示放大結果,適合電商商品圖。
<ZoomLens
src="/product.jpg"
alt="產品細節圖"
variant="panel"
panelPosition="right"
zoom={2.6}
size={200}
className="w-64"
/>Props
| Prop | 型別 | 預設值 | 說明 |
|---|---|---|---|
src | string | — | 圖片來源網址 |
alt | string | "" | 圖片替代文字 |
variant | "lens" | "panel" | "lens" | 放大呈現方式 |
zoom | number | 2.5 | 放大倍率 |
size | number | 160 | 鏡片直徑(lens)/面板邊長(panel),單位 px |
shape | "circle" | "square" | "circle" | 鏡片形狀(僅 lens) |
panelPosition | "right" | "left" | "top" | "bottom" | "right" | 面板位置(僅 panel) |
disabled | boolean | false | 停用放大互動,僅顯示原圖 |
onZoomChange | (active: boolean) => void | — | 放大開關狀態變更回呼 |
className | string | — | 圖片框 className,於此指定圖片尺寸 |
imageClassName | string | — | <img> 的 className |
細節
- 於
className給定寬度(如w-full max-w-md),圖片以h-auto依原比例撐開,元件透過ResizeObserver量測顯示尺寸並據此計算放大背景。 - 取景中心會被夾取在圖片範圍內,放大內容不會露出空白邊。
- 位置以 Motion spring 平滑跟隨;
lens與panel共用同一套背景座標運算,倍率與尺寸表現一致。 - 支援滑鼠、觸控與觸控筆(Pointer Events);觸控時以拖曳移動取景,放開即收起。
可及性
<img>保留alt,放大互動屬漸進增強,輔助科技仍可正常朗讀圖片。- 鏡片、取景框、放大面板皆為裝飾層並標記
aria-hidden,不干擾閱讀順序。 - 使用者系統開啟「減少動態效果」時,跟隨與淡入淡出動畫即時到位、不使用 spring 與縮放。
- 元件會清理
ResizeObserver,卸載時不遺留監聽。