前端截图功能方案汇总
目前了解到的两种方案
- html2canvas
- webRTC
html2canvas
实现原理
- 递归目标元素的所有 DOM 节点,填充到一个
renderList,并附加是否为顶层元素/包含内容的容器 等信息 - 通过
z-index、position、float等css属性和元素的层级信息将renderList排序,计算出一个canvas的renderQueue - 遍历
renderQueue,将css样式转为setFillStyle可识别的参数,依据nodeType调用相对应canvas方法,如文本则调用fillText,图片drawImage,设置背景色的div调用fillRect等 - 将画好的
canvas填充进页面
资源地址
常见问题解决方案
- 跨域方面: 配置
allowTaint: false - 截图锯齿: 根据设备像素比进行缩放
const scale = window.devicePixelRatio; - 对 CSS3 支持不好: 不支持部分 CSS3 样式, 如
background-blend-mode、background-clip: text、box-decoration-break、repeating-linear-gradient()、font-variant-ligatures、mix-blend-mode、writing-mode、writing-mode、border-image、box-shadow、filter、zoom、transform等 - 图片跨域: 需要后端支持图片跨域
性能问题
由于这种方案需要遍历目标元素下的所有 DOM 再转为 canvas,所以一旦 dom 过多,就会导致转换巨慢(页面卡死 4-6s)
webRTC
实现原理
- 使用
getDisplayMedia来捕获屏幕,得到MediaStream流 - 将得到的
MediaStream流输出到video标签中 - 使用
canvas将video标签中的内容绘制到canvas容器中
资源地址
缺点
- 首次使用截图,浏览器会要求获取共享屏幕权限
- 得保证网站运行在
https或者localhost环境
相关资料
- 浏览器-在网页中使用自定义截图功能
- 实现Web端自定义截屏(JS版)
- 实现Web端自定义截屏
- js-web-screen-shot
- html2canvas
- cropperjs(针对 img 或 canvas 的截图)