WebberUI

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.jsonfiles[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型別預設值說明
srcstring圖片來源網址
altstring""圖片替代文字
variant"lens" | "panel""lens"放大呈現方式
zoomnumber2.5放大倍率
sizenumber160鏡片直徑(lens)/面板邊長(panel),單位 px
shape"circle" | "square""circle"鏡片形狀(僅 lens
panelPosition"right" | "left" | "top" | "bottom""right"面板位置(僅 panel
disabledbooleanfalse停用放大互動,僅顯示原圖
onZoomChange(active: boolean) => void放大開關狀態變更回呼
classNamestring圖片框 className,於此指定圖片尺寸
imageClassNamestring<img> 的 className

細節

  • className 給定寬度(如 w-full max-w-md),圖片以 h-auto 依原比例撐開,元件透過 ResizeObserver 量測顯示尺寸並據此計算放大背景。
  • 取景中心會被夾取在圖片範圍內,放大內容不會露出空白邊。
  • 位置以 Motion spring 平滑跟隨;lenspanel 共用同一套背景座標運算,倍率與尺寸表現一致。
  • 支援滑鼠、觸控與觸控筆(Pointer Events);觸控時以拖曳移動取景,放開即收起。

可及性

  • <img> 保留 alt,放大互動屬漸進增強,輔助科技仍可正常朗讀圖片。
  • 鏡片、取景框、放大面板皆為裝飾層並標記 aria-hidden,不干擾閱讀順序。
  • 使用者系統開啟「減少動態效果」時,跟隨與淡入淡出動畫即時到位、不使用 spring 與縮放。
  • 元件會清理 ResizeObserver,卸載時不遺留監聽。

On this page