用JavaScript将DOM绘制成图片
之前看到了一个动画,https://jdc.jd.com/lab/2018-ae2css/washer/,就琢磨着怎么简单实现一下。要做的,就是将DOM的内容原原本本复制,并绘制成图片。
实现原理
SVG的foreignObject标签,可以包含html片段,这样就可以将整个DOM片段转换成SVG。
不过要注意的是,如果样式在样式表内,则svg里面对应的class是无效的,Chrome下可以把包含样式的style标签内容一并加进去,然后就可以通过类名来设置样式了,也可以通过遍历样式并添加style="key: value;"使样式生效。可以使用window.getComputedStyle来获取DOM的样式。 如果嫌麻烦,还可以使用html2canvas库。
SVG内DOM节点的xmlns属性不能省略。
/* 如何转换成图片 */
const html = `
<svg width="100" height="100" xmlns="http://www.w3.org/2000/svg">
<foreignObject width="100%" height="100%">
<div xmlns="http://www.w3.org/1999/xhtml">Hello, world!</div>
</foreignObject>
</svg>`;
const svg = new Blob(html.split(''), {
type: 'image/svg+xml;charset=utf-8'
});
const url = window.URL.createObjectURL(svg); // 生成的图片地址
代码演示
这是一段古诗,准备转换成图片。
八阵图
[唐] 杜甫
功盖三分国,名成八阵图。
江流石不转,遗恨失吞吴。
图片预览