前端截图工具--html2canvas和html-to-image的一些踩坑

结论: 截图工具还得是html-to-image好用upupup

事情的起因是这样的,某个炫酷的页面上画了几张echarts图表,用户需要把图表下载下来,但是又不想一张一张的下载,就想把这几张图打包下载。打包压缩用 jszip没啥说的,下载echarts怎么办呢。

下载echarts图表的三种方法

1. 配置项中配置toolbox 工具栏,内置有导出图片,可以提供一个导出按钮,点击之后导出图标。
yaml 复制代码
 toolbox: {
    show: true,
    feature: {
      saveAsImage: {} // 导出图片配置
    }
  },
2. getDataURL 方法,返回一个base64格式的URL.
php 复制代码
myChart.getDataURL({ pixelRatio: 2, backgroundColor: '#fff' });
3. 使用前端截图工具html2canvas
ini 复制代码
import html2canvas from 'html2canvas';
chartElement = document.getElementById(chartId)
const canvas = await html2canvas(chartElement, { useCORS: true });
const imageData = canvas.toDataURL('image/png');

但是html2canvas有一下弊端,由于html2canvas 是收集元素的css配置之后重绘,那么它计算重绘的过程中会产生css样式跟原图有差异的情况。我遇到的情况有

  1. 图表的背景变白色
  2. 文字下移

问题1的原因是图表背景色是在最外层的父节点上设置的,下载节点就是'chartId'元素和echarts图表上没有设置背景色。这个简单,在下载节点上设置下背景色就解决了 问题2 搜了很多方法,都不能很好的解决。

时间有限,不行就换!

4. 好用的截图工具html-to-image
ini 复制代码
import { toPng } from 'html-to-image';
chartElement = document.getElementById(chartId)
const imageData = await toPng(chartElement, { cacheBust: true });

html-to-image 也会产生背景色变白的问题,但是只要在 'chartId'元素上设置下背景就解决了。没有文字下移的问题。截图很完美。

生成压缩文件的方法

使用jszipfile-saver插件实现,代码实现如下

javascript 复制代码
import { toPng } from 'html-to-image';
import JSZip from 'jszip';
import { saveAs } from 'file-saver';

const downZipFile = async () => {
  const zip = new JSZip();
  const screenshotsFolder = zip.folder('screenshots'); // 生成一个文件夹
  
  chartElement = document.getElementById(chartId)
  const imageData = await toPng(chartElement, { cacheBust: true });
  const base64Data = imageData.split(',')[1]; // 截图并提取出 base64Data
  
  screenshotsFolder.file(`${chartId}.png`, base64Data, { base64: true }); // 把图片添加到folder,可以设置图片的名字
  
  const zipContent = await zip.generateAsync({ type: 'blob' });
  saveAs(zipContent, 'charts_screenshots.zip');  // 下载压缩包,设置压缩包的名字
 }
相关推荐
浮生望15 小时前
React Router v7 实战全景:路由配置、嵌套路由、鉴权守卫与懒加载完整指南
前端
用户9385156350715 小时前
从零在浏览器里跑 DeepSeek-R1:WebGPU + Transformer.js 全链路实战(二)
前端·javascript·typescript
雪隐16 小时前
个人电脑玩AI-16让5060 Ti给你打工——MiniMax H3 提速实录:从"泡杯茶等视频"到"视频等你",一张 5060 Ti 的自我修养
前端·人工智能·后端
FungLeo16 小时前
Flutter Web 中文字体困境与渲染器选择:CanvasKit vs HTML renderer 实战
前端·flutter·html
敲代码的玉米C16 小时前
我修的那个 bug,制造了另一个 bug
前端·人工智能·架构
gis开发之家17 小时前
《Vue3 从入门到大神50篇》Vue3 源码详解(二十):生命周期钩子源码解析 —— onMounted / onUpdated 如何实现?
前端·javascript·前端框架·vue3·vue3源码
Narrastory17 小时前
我用 Claude Code 写代码不到 2 小时,却花了 3 天做完这个软件—Vibe Coding 的正确姿势,是设计不是生成
前端·人工智能·github
Enaium17 小时前
我实现了KMP的SDL绑定并编写了高性能软光追
前端·kotlin
古夕17 小时前
本地正常线上白屏:一次路由切换后刷新恢复问题的排查与修复
前端·ai编程
栀鸢ouo17 小时前
解决Element Plus表格展开行横向溢出、滚动截断问题(项目实战方案)
前端·vue.js