snapDOM 上线即爆火,html2canvas 被彻底淘汰?

boyanx4个月前技术教程32

大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!

什么是 snapDOM

snapDOM 是一款快速精准的 DOM 转图像捕获工具,专为基于缩放的视图过渡框架 Zumly 打造。

snapDOM captures HTML elements as images with exceptional speed and accuracy.

snapDOM 可以将任何 HTML 元素捕获为可缩放的 SVG 图像,并保留样式、字体、背景图像、伪元素甚至阴影 DOM,其还支持导出为光栅图像格式和 <canvas>,其具有以下明显特点:

  • 完整的 DOM 捕获,支持影子 DOM 和 Web Component
  • 嵌入的样式、伪元素和字体,例如:::before 和 ::after 伪元素,同时也支持处理 Font Awesome、Material Icons 等
  • 导出为 SVG、PNG、JPG、WebP 或画布
  • 超快,无依赖
  • 100% 基于标准 Web API
  • 支持使用 data-capture="exclude" 用于忽略元素
  • 支持 data-capture="placeholder" 和 data-placeholder-text 用于遮罩替换


snapDOM 不仅高度准确,而且速度极快。最新的基准测试表明,其与其他库相比,性能有显著提升:

目前 snapDOM 在 Github 通过 MIT 协议开源,短短开源时间有接近 1k 的 star、是一个值得关注的前端开源项目。

如何使用 snapDOM

首先需要安装相应的依赖:

npm i @zumer/snapdom
yarn add @zumer/snapdom
// 或者使用 CDN
<script src="https://unpkg.com/@zumer/snapdom@latest/dist/snapdom.min.js"></script>

接着就可以项目中引用:

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

下面是 snapDOM 的最基础用法:

const el = document.querySelector('#target');
const result = await snapdom(el, { scale: 2});

const img = await result.toPng();
document.body.appendChild(img);

await result.download({format: 'jpg', filename: 'my-capture'});

当然也可以使用下面的快捷方法:

const el = document.querySelector('#target');
const png = await snapdom.toPng(el);
document.body.appendChild(png);
const blob = await snapdom.toBlob(el);

其中 snapdom(el, options?) 返回具有可重用导出方法的对象:

{
  url: string;
  toRaw(): string;
  toImg(): Promise<HTMLImageElement>;
  // 返回 HTMLImageElement 对象
  toCanvas(): Promise<HTMLCanvasElement>;
  // 返回 Canvas 对象
  toBlob(): Promise<Blob>;
  //   返回 Blob 对象
  toPng(): Promise<HTMLImageElement>;
  // 返回 PNG 图片
  toJpg(options?): Promise<HTMLImageElement>;
  // 返回 JPG 图像
  toWebp(options?): Promise<HTMLImageElement>;
  // 返回 Webp 图像
  download(options?): Promise<void>;
}

同时值得一提的是,snapDOM 的 preCache() 函数还可用于预先加载外部资源(例如:图片和字体)。当需要捕获的元素很大且很复杂时,此功能尤其有用。

import {preCache} from '@zumer/snapdom';
await preCache(document.body);
import {snapdom, preCache} from './snapdom.mjs';
    window.addEventListener('load', async () => {
    await preCache();
    console.log(' Resources preloaded');
    });

当然,除了以上说明的优点外,snapDOM 也有一些限制条件,包括:

  • 外部图片必须支持 CORS 访问
  • 不支持 iframe 在 Safari 上使用 WebP 格式时,将回退到 PNG 渲染

参考资料

https://github.com/zumerlab/snapdom?tab=readme-ov-file

https://zumerlab.github.io/snapdom/

标签: html转canvas

相关文章

用html5的canvas和JavaScript创建一个绘图程序

本文将引导你使用canvas和JavaScript创建一个简单的绘图程序。首先准备容器Canvas元素,接下来所有的事情都会在JavaScript里面。1 <canvas id="canvasI...

从零开始:用Canvas绘制你的第一个动画小作品

在前端开发中,HTML5 的 <canvas> 元素为我们提供了一个强大的绘图平台。通过 JavaScript 控制 Canvas,你可以创建图表、游戏、动画甚至是图像处理工具。本文将带...

好程序员:前端JavaScript全解析——Canvas绘制形状(上)

●今天,我们来通过 canvas 提供的方法开绘制一些简单的形状绘制矩形绘制基础矩形。下面一起看看好程序员老师的讲解吧~●语法 : 工具箱.rect( 矩形起点 x 轴坐标, 矩形起点 y 轴坐标,...

canvas是什么?前端中canvas 性能为何会比 html/css 好?

更底层的操作 (Direct Pixel Manipulation):Canvas 本质上是一个位图画布。开发者通过 JavaScript API(如 fillRect, drawImage, arc...

Canvas学习笔记 | 多个示例详细讲述Canvas变形操作,干货

前言大家好,我是汪小成。最近在学习Canvas。这篇文章是我学习Canvas变形操作时记的笔记,欢迎大家审阅。简介在Canvas中有如下三个基本变形操作:图形平移:translate(x, y)图形缩...

Nextoffer极客编程挑战#022:使用HTML5画布生成文字淡入淡出效果

给定如下HTML:<div id="container"><canvas id="MyCanvas" width="350" height="200">不支持HTML5画布&l...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。