JavaScript Capture HTML As PNG
2024-12-27
筆記如何透過 JavaScript 提供使用者轉換瀏覽中的 HTML 元素為 PNG 圖片。
說明
目前採用的解決方案是透過 html2canvas 進行處理,作業原理是將 HTML 元素轉換為 Canvas 元素後透過 toDataURL
的方式轉換為 PNG 圖片。
<script src="https://html2canvas.hertzen.com/dist/html2canvas.min.js"></script>
<button id="captureBtn">Take Screenshot</button>
document.getElementById("captureBtn").addEventListener("click", () => {
const captureElement = document.querySelector("body");
html2canvas(captureElement).then(canvas => {
const link = document.createElement('a');
link.download = 'screenshot.png';
link.href = canvas.toDataURL();
link.click();
}).catch(error => {
console.error("Screenshot capture failed:", error);
});
});
直接的截圖效果就相當不錯,只是要注意截圖按鈕本身也會被截圖,可以透過 JS 動態生成按鈕,並在截圖前移除按鈕。
const captureBtn = document.getElementById("captureBtn");
if (captureBtn) {
captureBtn.parentNode.removeChild(captureBtn);
}
此外陰影、漸層、動畫等效果可能會有些問題,可以透過 CSS 調整或是透過 html2canvas
的參數進行調整。移除按鈕的動作,也可以整合在參數當中的 onclone
事件中進行 😎
html2canvas(captureElement, {
scale: 1,
backgroundColor: null,
useCORS: true,
allowTaint: true,
logging: true,
scrollX: 0,
scrollY: 0,
windowWidth: document.documentElement.scrollWidth,
windowHeight: document.documentElement.scrollHeight,
x: 0,
y: 0,
width: document.documentElement.scrollWidth,
height: document.documentElement.scrollHeight,
onclone: document => {
const captureBtn = document.getElementById("captureBtn");
if (captureBtn) {
captureBtn.parentNode.removeChild(captureBtn);
}
}
}).then(canvas => {
...
});
注意事項
html2canvas
會將所有的 CSS 轉換為 Canvas 元素,因此可能會有些效果無法轉換。html2canvas
需要搭配瀏覽器進行實作,不建議在 Node.js 環境中使用。html2canvas
專案中的建議為實驗性質,不要應用於正式環境,且最新的更新日期為 2022 年,必須注意專案維護的狀況。