dom-to-image转化核心主要是foreignObject标签,它可以嵌套任何html标签。而SVG元素允许包含不同的XML命名空间,利用实例化XMLSerializer并调用其serializaToString()方法把一个XML文档或者Node对象转为未解析的XML标记的一个字符串,然后再放到forgeinobejct标签里面将其解析成SVG的base64 url。 然后调用其封装好的方法就OK了,先看看效果图:
代码如下:react-hooks 先下载必要的两个包:
yarn add dom-to-image 或 npm install dom-to-image --save
yarn add file-saver 或 npm install file-saver --save
import React from "react";
import domtoimage from "dom-to-image";
import { saveAs } from "file-saver";
import "./index.css";
// 过滤掉所有<i>元素
function filter(node) {
return node.tagName !== "i";
}
const DomToImg = () => {
// 转为png格式的图片
const getImg = () => {
const node = document.getElementById("node");
domtoimage
.toPng(node)
.then(defaultUrl => {
const img = new Image();
img.src = defaultUrl;
img.setAttribute("className", "pngImg"); // 方便设置样式
// 将生成的png图片插入到当前页面
document.getElementById("export-img").appendChild(img);
// 手动点击图片下载 自动下载调用saveAs(defaultUrl, '自动保存.png')
img.addEventListener("click", () => {
var link = document.createElement("a");
link.download = "古诗词.png";
link.href = defaultUrl;
link.click();
});
})
.catch(() => {
console.log("error");
});
};
// 生成图片自动下载为png格式(将dom转为二进制再编译下载)
const getBlobPng = () => {
const node = document.getElementById("node");
domtoimage.toBlob(node).then(blob => {
// 调用file-save方法 直接保存图片
saveAs(blob, "自动保存.png");
});
};
// 转为Jpeg图片 --- 手动下载(自动下载调用saveAs(defaultUrl, '自动保存.png'))
const getJpeg = () => {
const node = document.getElementById("node");
domtoimage.toJpeg(node, { quality: 0.95 }).then(defaultUrl => {
var link = document.createElement("a");
link.download = "下载jpeg.jpeg";
link.href = defaultUrl;
link.click();
});
};
// 转为SVG图片---手动下载 (自动下载调用saveAs(defaultUrl, '自动保存.png'))
const getSVG = () => {
const node = document.getElementById("node");
domtoimage.toSvg(node, { filter: filter }).then(defaultUrl => {
const img = new Image();
img.src = defaultUrl;
img.setAttribute("className", "svgImg");
document.getElementById("export-img").appendChild(img);
img.addEventListener("click", () => {
var link = document.createElement("a");
link.download = "SVG";
link.href = defaultUrl;
link.click();
});
});
};
return (
<div className="dom-to-img">
<h1 className="dom-title">html转换为图片</h1>
<div id="node" className="node-content">
<p className="node-title">锄禾日当午</p>
<p className="node-title">汗滴禾下土</p>
<p className="node-title">谁知盘中餐</p>
<p className="node-title">粒粒皆辛苦</p>
</div>
<div className="my-actions">
<button onClick={getImg} className="action">
转为png图片
</button>
<button onClick={getBlobPng} className="action">
自动保存png
</button>
<button onClick={getJpeg} className="action">
自动保存jpeg
</button>
<button onClick={getSVG} className="action">
转为svg图片
</button>
</div>
<div id="export-img" className="my-image"></div>
</div>
);
};
export default DomToImg;
原理简易代码:
<svg>
<foreignObject x="0" y="0" width="100%" height="100%">
<div>
<span>dom转为html</span>
</div>
</foreignObject>
</svg>