前端页面截图实现
前端实现页面截图的几种常用方法
问题
前端如何实现页面截图?
解答
前端实现页面截图主要有以下几种方式:
1. html2canvas
最常用的前端截图库,通过遍历 DOM 节点并绘制到 Canvas 实现。
import html2canvas from 'html2canvas';
// 截取整个页面
html2canvas(document.body).then(canvas => {
const image = canvas.toDataURL('image/png');
// 下载图片
const link = document.createElement('a');
link.download = 'screenshot.png';
link.href = image;
link.click();
});
// 截取指定元素
const element = document.querySelector('#target');
html2canvas(element, {
backgroundColor: '#ffffff',
scale: 2, // 提高清晰度
useCORS: true // 允许跨域图片
}).then(canvas => {
document.body.appendChild(canvas);
});
2. dom-to-image
另一个流行的截图库,支持多种导出格式。
import domtoimage from 'dom-to-image';
const node = document.getElementById('target');
// 导出为 PNG
domtoimage.toPng(node)
.then(dataUrl => {
const img = new Image();
img.src = dataUrl;
document.body.appendChild(img);
});
// 导出为 JPEG
domtoimage.toJpeg(node, { quality: 0.95 })
.then(dataUrl => {
// 处理图片
});
// 导出为 Blob
domtoimage.toBlob(node)
.then(blob => {
// 上传到服务器
});
3. Canvas API 手动绘制
适合简单场景,需要手动处理 DOM 元素。
function captureElement(element) {
const canvas = document.createElement('canvas');
const ctx = canvas.getContext('2d');
const rect = element.getBoundingClientRect();
canvas.width = rect.width;
canvas.height = rect.height;
// 绘制背景
ctx.fillStyle = window.getComputedStyle(element).backgroundColor;
ctx.fillRect(0, 0, canvas.width, canvas.height);
// 绘制文本等内容(需要逐个处理)
ctx.fillStyle = '#000';
ctx.font = '16px Arial';
ctx.fillText(element.textContent, 10, 30);
return canvas.toDataURL();
}
4. 服务端截图(Puppeteer)
适合需要高质量截图或复杂页面的场景。
// Node.js 服务端代码
const puppeteer = require('puppeteer');
async function screenshot(url) {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(url, { waitUntil: 'networkidle2' });
await page.setViewport({ width: 1920, height: 1080 });
const screenshot = await page.screenshot({
path: 'screenshot.png',
fullPage: true // 截取整个页面
});
await browser.close();
return screenshot;
}
关键点
- html2canvas 和 dom-to-image 是最常用的前端截图方案,无需后端支持
- 跨域图片需要设置
useCORS: true或使用代理 - 提高
scale参数可以获得更清晰的截图,但会增加性能开销 - Canvas 手动绘制适合简单场景,复杂布局建议使用成熟库
- Puppeteer 适合服务端截图,支持完整的浏览器渲染能力
目录