实现原理

使用svg的一个特性,允许在<foreignobject>标签中包含任意的html内容。

  • 主要是 [XMLSerializer |dom转为svg]

  • ​dom 转换为 XHTML

    • XMLSerializer 对象使你能够把一个 XML 文档或 Node 对象转化或“序列化”为未解析的 XML 标记的一个字符串

    • 要使用一个 XMLSerializer,使用不带参数的构造函数实例化它 ,然后调用其 serializeToString() 方法;

    • 递归去克隆dom节点

    • 遇到canvas转为image对象

    • 提取元素computed样式,并且插到新建的style标签上面,对于":before,:after"这些伪元素,会提取其样式,放到新建样式名中并且插入到新建的style标签中,供所属的节点使用。

    • 处理输入内容和svg。

    • 插入字体

      • 获取所有样式表并处理为数组,提取包含 rule.type === CSSRule.FONT_FACE_RULE 规则,再提取包含 src 的 rules。

      • 下载资源,将资源转为dataUrl并给 src 使用。

    • 处理图片

      • 图片都处理为dataUrl

    • 示例一

  • 使用svg中的<foreignobject>

    • 序列化dom节点为字符串,然后在 foreignObject 嵌入转换好的字符串,

    • foreignObject 能够在 svg 内部嵌入XHTML,再将svg处理为dataUrl数据

  • 用 canvas 渲染出处理好的 dataUrl 数据

    • 新建img

    • img赋值已经组合好的dataUrl;

    • img 转化为 canvas;

      • canvas.drawImage(image, dx, dy)

      • https://developer.mozilla.org/zh-CN/docs/Web/API/CanvasRenderingContext2D/drawImage

  • canvas转化为 bold类型;

    • canvas.toBlob(callback, type, encoderOptions);

    • https://developer.mozilla.org/zh-CN/docs/Web/API/HTMLCanvasElement/toBlob

// 示例一<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Document</title></head><body onload="load()"><div id="long"><span>1111</span><h1>222222</h1>hello SeriousLose</div></body>
</html>
<script>function load() {let long = document.getElementById('long');let xmlStr = new XMLSerializer();let xml = xmlStr.serializeToString(long);console.log(xml);let dom = `data:image/svg+xml;charset=utf-8,<svg viewBox="0 0 200 200" xmlns="http://www.w3.org/2000/svg"><style>polygon { fill: black }div {color: white;font:12px serif;height: 100%;overflow: auto;}</style><polygon points="5,5 195,10 185,185 10,195" /><!-- Common use case: embed HTML text into SVG --><foreignObject x="20" y="20" width="160" height="160">${xml}</foreignObject></svg>`;let img = new Image();img.src = dom;document.body.appendChild(img);img.onload = () => {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');canvas.width = img.naturalWidth;canvas.height = img.naturalHeight;ctx.drawImage(img, 0, 0);canvas.toBlob(function (blob) {let url = URL.createObjectURL(blob);const a = document.createElement('a');a.style.display = 'none';document.body.appendChild(a);a.href = url;a.download = 'image';a.click();window.URL.revokeObjectURL(url);}, 'image/png');};}
</script>

Dom-to-image相关推荐

  1. 【JavaScript总结】JavaScript语法基础:DOM

    ->DOM的理解:文档对应dom树 ->有了DOM能做什么:DOM的操作 html文档做为DOM树模型,DOM树的节点就是对象.对象会触发事件来执行一些事件代码. C#中的事件是一个委托变 ...

  2. DOM相关内容(课程来源:B站 后盾人)

    课程来源:B站后盾人 有关DOM的介绍 在此引用一位大佬的博客的部分内容: JS-DOM https://blog.csdn.net/weixin_45077672/article/details/1 ...

  3. 获取DOM节点的几种方式

    DOM 是一个树形结构,操作一个DOM节点,实际上就是这几个操作:更新.删除.添加.遍历 在操作DOM节点之前,需要通过各种方式先拿到这个DOM节点,常用的方法有: 一.通过元素类型的方法来操作: d ...

  4. java script DOM操作

    ---恢复内容开始--- 一.javascript功能: 1.进行数据运算 2.控制浏览器功能 3.控制元素的属性.样式.内容 二.javascript书写位置 1.可以写在HTML文件的任意位置,书 ...

  5. jQuery和dom的相互转换

    1.将DOM对象转换成jQuery对象 $div = $(objDom); 2.将jQuery对象转换成DOM对象 objDom = $(objJqeury).get(0); 3.判断一个元素是否存在 ...

  6. IE9 : DOM Exception: INVALID_CHARACTER_ERR (5)

    以下代码在IE8下运行通过,在IE9中出错: document.createElement('<iframe id="yui-history-iframe" src=&quo ...

  7. dom vue 加载完 执行_前端面试题——Vue

    前言 前几天整理了一些 html + css + JavaScript 常见的面试题(https://segmentfault.com/u/youdangde_5c8b208a23f95/articl ...

  8. php js怎么去掉类属性,如何修改DOM中的属性,类和样式

    通过jQuery来获取要修改的DOM元素,然后通过JavaScript中方法来对属性.类以及样式进行修改 今天在本篇文章中将分享的是如何通过修改html元素节点的样式,类和属性来进一步的更改dom,, ...

  9. DOM+XPath提取规则注记!

    下面是使用DOM+Xpath提取html中页面时经常使用的Xpath规则的一些示例: XPath相关的规则 没有属性 //B[not(@*)] 没有类属性 //B[not(@class)] 要求链接有 ...

  10. js里的document对象大全(DOM操作)

    什么是DOM document object model 的简称,意思为文档对象模型.主要用来对文档中的html节点进行操作. Dom的操作简单示例: <div id="t1" ...

最新文章

  1. Linux输入输出I/O
  2. cmd orcal 中文乱码
  3. BZOJ 2733 | 洛谷 P3224 [HNOI2012]永无乡
  4. python iloc函数_python选取特定列 pandas iloc,loc,icol的使用详解(列切片及行切片)
  5. c语言程序后退_c语言中向后退一格是啥符号?
  6. 以串结构存储c语言版,数据结构C语言版 串的块链存储表示和实现
  7. Android 8.0 学习(3)---Android Treble
  8. LookupError: unknown encoding: utf-8
  9. ubuntu中wps缺失字体
  10. Tomcat下快逸报表中文乱码问题怎么解决
  11. Spyder中出现IndentationError:unindent does not match any outer indentation level错误
  12. RxJava2.0_1:基础学习和理解
  13. 毕业设计——GPU地形高度查询
  14. linux usb检测工具,Linux下USB设备检测全教程
  15. 说文解字:SEO如何赢在起跑线上
  16. oschina使用方法
  17. 为什么阿里巴巴禁止开发人员 boolean 类型变量使用 isXXX 来命名?
  18. 关于在xp(sp3 专业版)下安装sql2005开发版图解
  19. JavaScript封装异步函数 —— 【异步编程】 —— 如何获取一个函数中异步操作的结果?
  20. 初一年级计算机教案,人教版七年级信息技术教学计划及教案

热门文章

  1. 第八章应用安全工程备考要点及真题分布
  2. Android Canvas类介绍和Android Draw Rect 坐标图示
  3. Android之父深入解析Android
  4. 读取properties文件,中文乱码
  5. js中 var a= b || c;
  6. Focal Loss 的Pytorch 实现以及实验
  7. 【LeetCode】图论 graph(共20题)
  8. 利用vi编辑器创建和编辑正文文件(二)
  9. 2017.8.17实操总结
  10. 关于Linux开源项目基础组件make编译流程