总结一下目前了解到的网页截图功能实现

一 dom-to-image

1 npm地址:

https://www.npmjs.com/package/dom-to-image

2 介绍:

dom-to-image 是一个JS类库,它可以将任意DOM节点转换成 SVG/PNG/JPEG 格式的图像。它基于 domvas by Paul Bakaus 进行重写,修复了一些一至错误,并添加了部分功能(如web字体和图像支持)。

3 基本原理:

SVG的foreignObject标签可以包裹任意的html内容

  1. 递归地拷贝原始dom节点和后代节点;

  2. 把原始节点以及后代节点的样式递归的应用到对应的拷贝后的节点和后代节点上;

  3. 字体处理;

  4. 图片处理;

  5. 序列化拷贝后的节点,把它插入到foreignObject里面,然后组成一个svg,然后生成一个data URL;

  6. 如果想得到PNG内容或原始像素值,可以先使用data URL创建一个图片,使用一个离屏canvas渲染这张图片,然后从canvas中获取想要的数据。

4 弊端:

​ 1.长时间未维护更新,最近更新是在4年前

​ 2.存在外部资源无法正确加载情况

二 html2canvas

1 npm地址:

​ https://www.npmjs.com/package/html2canvas

2 官网及文档:

​ http://html2canvas.hertzen.com/

3 实现原理

  1. 递归取出目标模版的所有DOM节点,填充到一个rederList,并附加是否为顶层元素/包含内容的容器 等信息
  2. 通过z-index postion float等css属性和元素的层级信息将rederList排序,计算出一个canvas的renderQueue
  3. 遍历renderQueue,将css样式转为setFillStyle可识别的参数,依据nodeType调用相对应canvas方法,如文本则调用fillText,图片drawImage,设置背景色的div调用fillRect
  4. 将画好的canvas填充进页面

4 部分问题处理

  1. 跨域方面: 配置allowTaint: false

  2. 截图锯齿:根据设备像素比进行缩放 const scale = window.devicePixelRatio;

  3. 对 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

    但是好在该工具目前仍活跃更新,从最初不支持跨域到后来通过配置来解决跨域问题,是非常知名的截图库

三 js-web-screen-shot

1 npm地址:

https://www.npmjs.com/package/js-web-screen-shot

2 介绍:

一款带有工具条的功能十分强大的网页截图工具,目前仍在积极维护中,经历了近三十个版本迭代,最初版本于一年前发布,因功能完整,维护频繁,使用时需多留意更新版本,截取浏览器界面外部留意开启webRTC支持

3 原理分析:

https://juejin.cn/post/6924368956950052877

4 其它:

该库有对应的vue3版本可选择,如果在实际项目中有复杂的截图需求,并且项目是使用vue3开发的,可以使用该库:vue-web-screen-shot

参考文档:
https://juejin.cn/post/6844903465756393486
https://segmentfault.com/a/1190000037673677

浏览器-在网页中使用自定义截图功能相关推荐

  1. 探索在原生网页中使用自定义数据属性

    先说说我为什么有这种"奇怪"的想法. 它基于这样一个场景:我最近闲来无事完善了一个小demo:音乐播放器.在里面有一个功能 -- 点击列表某一项弹出音乐播放弹框.我原先一直是&qu ...

  2. python 列表比较不同_使用Python中的自定义比较功能对列表进行排序

    由于OP要求使用自定义比较功能(这也是导致我提出这个问题的原因),因此我想在这里给出可靠的答案: 通常,您要使用内置的return fitness(item2) - fitness(item1)函数, ...

  3. 网页视频播放器的截图功能

    现在很多视频网站的播放器没有截图功能,这里提供几行截图脚本,需要的网友可以试试.实现原理很简单,就是获取video元素,然后绘制到canvas元素并获取图片数据,之后下载下来.所以,这个脚本只能用于H ...

  4. 使用IE浏览器“下载”网页中没有下载地址的视频

    编写不易,如有转载,请声明出处:http://blog.csdn.net/zxc514257857/article/details/70289918 原理   IE浏览器可以缓存播放过的视频 清除IE ...

  5. 网页中链接实现打印功能

    链接实现网页打印功能 <a href="javascript:if(window.print)window.print()" target='_self' title='打印 ...

  6. 【C#】ASP.NET网页中添加单点登录功能

    背景 首先,要说明的是,原先需求定义的是,同一个账号只能同时有一个人来登录,如果另外一个登录的话,前一个登陆者就自动被踢掉.本来原先要做成存储到服务器的数据库中,但是后来如果是非正常退出的话 下次就没 ...

  7. 在网页中添加百度分享功能

    1  百度分享图标 <!-- Baidu Button BEGIN -->     <div id="bdshare" class="bdshare_t ...

  8. 怎么用狐火浏览器查看网页中隐藏的***密码

  9. 一键获取网页中的全部图片并批量下载(国内淘宝天猫京东网站+国外商品页面)——亲测有效

    上周六的时候,有个朋友找到我,需要将网页中的图片全部下载下来,而且还不能改变图片的大小: 作为一个前端,经常跟html打交道,我深知页面中肯定是有图片链接的 网页中下载少量图片的方法 举例说明网页中图 ...

最新文章

  1. java 正确使用 Volatile 变量
  2. MySQL相关日志介绍
  3. as工程放到源码编译_方舟编译器学习笔记2 源码编译
  4. QTP提供的编程接口实现对QTP操作
  5. noip模拟赛 都市
  6. cpu压力测试 Android,测试CPU和GPU性能压力(StressMyPC)
  7. sl400升级win10_联想SL400全安装WIN7(官方最完美教程).doc
  8. Fiddler下载安装、配置https证书、抓取手机app请求教程(官网)
  9. Google正确搜索方法
  10. 判断矩形相似C语言,C++判断矩形相交的方法
  11. 技术笔试面试题(下)
  12. ESP车身电子稳定系统
  13. 修炼你的《九阳神功》行走江湖
  14. 你了解国际版的阿里云吗?
  15. 找出知晓秘密的所有专家
  16. Android Camera使用OpenGL ES 2.0和GLSurfaceView对预览进行实时二次处理(黑白滤镜)
  17. 如何把illustrator圆圈5等分?
  18. java des 中文乱码_网络上DesUtil.java关于汉字加密解密出现乱码的问题
  19. 什么是模型思维?发现问题解决问题之道:14种 MR 模型关系思维模式
  20. Ubuntu配置和使用cups打印服务器

热门文章

  1. 如何做出科技感十足的宣传片?
  2. MTi-300Windows使用及数据导出
  3. 笔记本c盘变红满了怎么清理呢?有什么好的清理方法?
  4. centos 定时删除文件_Centos 定时清理文件(Shell ) | 剑花烟雨江南
  5. 微型计算机数值,微型计算机的实用数值方法-生活阅读.pdf
  6. ROS ros_control wiki 学习笔记
  7. STM32固件升级详解(BootLoader)
  8. Undertow介绍
  9. App混合开发-前端小白理解
  10. 洛谷1522 牛的旅行