前端js代码实现截图功能
据我所知,屏幕截图大致可以分为两种类型。
一种是真-屏幕截图,也就是我们平常QQ,微信,钉钉等社交工具里面所用到的截图。也就是说它能把我们看到的东西截取下来,所见即所得。
另一种是通过获取网页DOM元素的截图。它的原理就是获取到网页上的DOM元素,再将他们放到canvas画布里面,最后再又画布转为图片,这样就实现了屏幕截图的功能。目前有好多方法可以实现此功能,一 一 介 绍 :
1.html2canvas方法(最方便,最常用,效果也不错~)
html2canvas
是一种JavaScript实现页面截图的类库。它使用起来比较方便。
使用方法:
import html2canvas from "html2canvas"
html2canvas(document.getElementById(container'),{
backgroundColor: "transparent",
allowTaint: true,
}).then((canvas) => {
console.log(canvas)
// 将画布展示到最前端
canvas.id = 'canvas'
document.body.appendChild(canvas);
document.getElementById('canvas').style.position = 'fixed'
document.getElementById('canvas').style.top = '0'
document.getElementById('canvas').style.left = '0'
document.getElementById('canvas').style.zIndex = '9999'
// 下载图片到本地
var a = document.createElement("a");
a.href = canvas.toDataURL("image/jpg");
a.download = '图片';
a.click();
});
其中,
document.getElementById(container')
指定了要截取哪个DOM元素中的内容。第二个参数对象{ backgroundColor: "transparent",allowTaint: true,}
指定了一些截图的参数。详细见下表:
参数名称 | 参数类型 | 默认值 | 描述 |
allowTaint | boolean | false | 是否允许跨域 |
background | string | #fff | canvas的背景颜色,如果没有设定默认透明 |
height | number | null | canvas高度设定 |
letterRendering | boolean | false | 在设置了字间距的时候有用 |
logging | boolean | false | 在console.log()中输出信息 |
proxy | string | undefined | 代理地址 |
taintTest | boolean | true | 是否在渲染前测试图片 |
timeout | number | 0 | 图片加载延迟,默认延迟为0,单位毫秒 |
width | number | null | canvas宽度 |
useCORS | boolean | false | 涉及到画布转图片的问题(截图功能) |
此表格来源于:html2canvas
上述表格中比较常用的就只是前两个,涉及到跨域问题。
踩坑记录
canvas渲染:
在涉及到一些有二维地图的页面的时候,一开始没有配置允许跨域,发现截取不到地图等图层内容。我就以为地图等图层内容不存在于DOM元素上,后来检查页面元素节点树才发现,地图等图层也是放置在DOM元素上的,因此在配置了允许跨域后就能重新渲染出来。
canvas画布转图片:
涉及到跨域的图片虽然能够渲染到canvas画布中,但是此时画布因为存在跨域的图片,已经受到了污染,因此无法正常转为图片。在执行上面的**保存画布为图片(即截图功能的实现)**的代码的时候,就需要将useCORS
参数设置给加上去,并且设置为true
。经过本人亲测,能够实现保存画布为图片(png格式,不知道为啥明明设置了toDataURL("image/jpg")
,但还是转的png
)。
2.puppeteer
使用方法:puppeteer.js
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setViewport({ // 设置视窗大小
width: 1920,
height: 1080
});
await page.goto('https://zhfw.tianditu.gov.cn/'); // 打开页面
await page.screenshot({path: 'example.jpg'}); // path: 截屏文件保存路径
await browser.close();
})();
用命令
node puppeteer.js
运行一下该文件即可去到指定页面然后截图。
3.
还有其他方法待更新…