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

boyanx4个月前技术教程33

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

什么是 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

相关文章

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

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

canvas学习和面向对象(二)(canvas 教程)

Canvas 学习(二)上一篇Canvas 学习(一)中我是用canvas绘制了一些基本和组合的图形.现在开始绘制图片和动画帧,以及面向对象的升级版本.还是一样,看代码,所有的代码都托管在github...

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

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

OpenAI技术直播第四弹!推出ChatGPT内置工具Canvas,有三大核心功能

每经编辑:毕陆名昨天的Sora掀起热潮,今天OpenAI又给我们带来了升级版Canvas。Canvas正式向所有用户开放,并与OpenAI的主要模型深度集成。Canvas内置在ChatGPT中,打开C...

用HTML5+Canvas,自制论坛头像LOGO

在论坛中,一个独特的头像LOGO能让人脱颖而出。借助HTML5的Canvas技术,无需专业设计软件,在纯前端环境就能打造专属4字方形LOGO,为论坛形象添彩。 Canvas:前端绘图的魔法工具 Ca...

网页游戏开发基础——Canvas基本图形绘制

  什么是Canvas?Canvas是HTML5新增的一个标签,你可以把它翻译为画布,通过它可以绘制二维或三维图形,有了它就可以不用安装flash而实现复杂的动画功能。如何通过Canvas绘图?下面我...

发表评论    

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