snapDOM 是一款高保真的 DOM 捕获工具,是我正在为 Zumly 开发的动画引擎的一部分。Zumly 是一个用于创建平滑的基于缩放的视图转换的框架。

它可以将任何 HTML 元素转换为可缩放的 SVG 图像,同时保留样式、字体、背景、Shadow DOM 内容、伪元素等等。

安装

您可以通过 NPM, CDN, script tag, 或者通过 importing it as a module 来使用 snapDOM

NPM / Yarn

npm i @zumer/snapdom
yarn add @zumer/snapdom

CDN

<script src="https://unpkg.com/@zumer/snapdom@latest/dist/snapdom.min.js"></script>

Script tag (local)

<script src="snapdom.js"></script>

全局对象 snapdom 将可用。

ES Module

import { snapdom } from './snapdom.mjs';

Script Tag (Type Module)

<script type="module">
 import { snapdom } from 'https://unpkg.com/@zumer/snapdom@latest/dist/snapdom.mjs';
</script>

现在您可以直接在您的 JavaScript 中调用 snapdom(el), snapdom.toPng(el) 等方法。

基本用法

// Capture an element as SVG Data URL
const svgDataUrl = await snapdom(document.querySelector("#myElement"));
// Insert the captured image into the page
const img = new Image();
img.src = svgDataUrl;
document.body.appendChild(img);

API

主要的 API 通过 snapdom 暴露,并提供多种捕获方法:

Method | Description | Returns ---|---|--- snapdom(el, scale?) | 捕获为 SVG Data URL | Promise<string> snapdom.toImg(el, scale?) | 捕获为 HTMLImageElement (SVG) | Promise<HTMLImageElement> snapdom.toCanvas(el, scale?) | 捕获为 HTMLCanvasElement | Promise<HTMLCanvasElement> snapdom.toPng(el, scale?) | 捕获为 PNG 图像 (Image) | Promise<HTMLImageElement> snapdom.toJpg(el, scale?, quality?) | 捕获为 JPG 图像 (Image) | Promise<HTMLImageElement> snapdom.toWebp(el, scale?, quality?) | 捕获为 WebP 图像 (Image) | Promise<HTMLImageElement> snapdom.toBlob(el, scale?) | 捕获为 SVG Blob | Promise<Blob>

参数:

特殊功能

完整示例

<div id="captureMe">
 <h1 style="color: tomato;">Hello World!</h1>
 <p>This content will be captured.</p>
</div>
<script type="module">
 import { snapdom } from './snapdom.esm.js';
 const button = document.createElement('button');
 button.textContent = "Capture";
 button.onclick = async () => {
  const img = await snapdom.toPng(document.getElementById('captureMe'), 2);
  document.body.appendChild(img);
 };
 document.body.appendChild(button);
</script>

局限性

基准测试

snapDOM 不仅高度准确,而且在捕获大型或复杂的 DOM 结构时也 非常快

在针对流行库的基准测试中:

Element Size | Winner | Compared to modern-screenshot | Compared to html2canvas ---|---|---|--- 200×100 (Small) | modern-screenshot | 1.18× faster | 4.46× faster 400×300 (Modal) | snapDOM | 1.04× faster | 4.07× faster 1200×800 (Page view) | snapDOM | 2.43× faster | 5.74× faster 2000×1500 (Large scroll area) | snapDOM | 5.02× faster | 9.35× faster 4000×2000 (Very large) | snapDOM | 11.35× faster | 15.98× faster

关键发现:虽然 modern-screenshot 对于非常小的元素来说仍然稍快一些,但 随着 DOM 大小的增加,snapDOM 显著优于所有其他元素

非常适合:

许可证

MIT © Juan Martín Muda - Zumerlab

snapDOM captures DOM nodes as images with exceptional speed avoiding bottlenecks and long tasks.