
snapDOM 是一套可以將單一或多個 HTML 元素(包含 shadow DOM、Web Components)的內容「拍成」SVG/PNG/JPG/WebP/canvas 或 Blob 格式圖片的工具。執行方式僅為標準 Web API,不需要再讀取其他大型資源。
簡單來說,如果你在網頁上有一區域(如報表、圖表、動態內容)希望轉成圖片/下載/儲存,snapDOM 提供了快速且高保真的方式。
主要特點
-
完整 DOM 抓取:支援 shadow DOM、Web Components。
-
保留樣式、偽元素、字型、背景圖:可將 ::before、::after 偽元素、字型(Web Fonts、Icon Fonts)與背景圖像一起內嵌。
-
多格式輸出:可輸出為 SVG、PNG、JPG、WebP、Canvas、Blob,或直接下載。
-
高效性能:官方 Benchmark 顯示在多種情境下比部分舊工具(如 html2canvas)快許多倍。
-
可設定參數:如 scale (輸出倍率)、width/height (自訂尺寸)、背景色、品質 (quality) 等,讓輸出圖片可控。
-
安裝方式多樣:支援 npm、Yarn、CDN、ES Module、script 標籤。開發者整合上非常彈性。
-
排除/占位設定:支援 data-capture="exclude" 跳過某些元素、或 data-capture="placeholder" + data-placeholder-text 替代特定區塊。
優點與注意事項
優點
-
快速且流程簡單:只要選取 DOM 節點後,呼叫 snapdom 或快捷方法如 toPng(),就能取得圖片物件或觸發下載。這對於「分享頁面畫面」「報表匯出」等場景非常好用。
-
高還原度:保持背景圖片、字型、偽元素效果(例如 ::before 加裝飾)、shadow DOM 內容,呈現出來的圖片較少失真或缺失樣式。
-
輕量、無額外大型依賴:不像某些截圖工具需額外大型 canvas 庫,snapDOM 基於標準瀏覽器 API。
-
可控輸出:如果需求是高解析度(如 Retina/2x 輸出),透過 scale 參數即可實現;或是固定寬高輸出也能設定。
注意事項/限制
-
外部圖片必須符合 CORS 要求:如果抓取的 DOM 內含跨域圖片(或字型)且沒有適當 CORS 設定,可能導致無法正確內嵌。官方支援 useProxy 選項作為替代。
-
無法捕捉 iframe 內容(尤其不同來源的 iframe):如果頁面設計中有 iframe 且其中內容希望截圖,snapDOM 無法支援。
-
當瀏覽器支援不佳或某些特殊 CSS 效果(如部分動畫、clip-path/mask)時,可能仍需額外測試:雖然工具標示支援很多特性,但「完全」相容所有瀏覽器與所有 CSS 情況仍是挑戰。
-
如果元素非常大(例如整頁長畫面、超長 scroll 區域),雖然官方宣稱效能佳,但實際還是要注意記憶體與圖片尺寸對瀏覽器的負擔。
適用場景與建議
若你正在以下這些情境中尋找解決方案,snapDOM 或許就是你要的工具:
-
在 Web 應用中提供「下載頁面為圖片」或「將特定區塊轉成圖片/分享」功能。
-
將動態產生的 HTML 報表、統計圖表、儀表板內容轉存為圖檔或嵌入 PDF。
-
在設計工具或低程式碼平台中,需要自訂畫面並生成圖像輸出。
-
作為前端專案內的「快速截圖」方案,不必依賴後端或伺服器端服務。
建議開發時可先做以下步驟:
-
確認欲截圖區塊的所有資源(圖片/字型)是否為同域名或已設 CORS /可被抓取。
-
使用 preCache() 方法預載資源,提升抓圖成功率與效果。
-
設定合適輸出倍率(scale)與寬高,避免圖片模糊或過大。
-
測試在目標瀏覽器(包含 行動裝置)上,確認樣式正確轉成圖片。
-
若頁面中含有 iframe 或特殊動畫,需另想替代方案或將該區塊轉為靜態再截圖。
總結來說,snapDOM 是一款「現代化、針對 DOM 轉圖片需求」的工具。它強調效率、高還原度、操作簡便,而且安裝整合相對直覺。如果你的專案有「把某個 DOM 區塊變成圖片/圖檔下載」的需求,那麼它值得一試。當然,使用前仍建議確認資源可抓取、瀏覽器相容、輸出尺寸合適等細節。