You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

点击按钮将多个Div保存为图片并打包成Zip的实现咨询

解决方案:用jQuery+类实现多Div转图片并打包Zip

嘿,我来帮你搞定这个需求!咱们要实现点击按钮把多个Div转成图片再打包成Zip,核心得靠两个工具库配合——html2canvas负责把DOM元素转成图片,jszip用来打包Zip,再用FileSaver触发下载。咱们用jQuery简化DOM操作,还把逻辑封装成类,代码更规整好维护~

准备工作:引入依赖库

先把需要的库通过CDN引入到页面里:

<script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jszip/3.10.1/jszip.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/FileSaver.js/2.0.5/FileSaver.min.js"></script>

完整实现代码

HTML结构

把你的Div和下载按钮放在页面里:

<div class="one"> test test test </div>
<div class="two"> test test test </div>
<button id="downloadBtn">下载所有Div为Zip</button>

CSS样式

保留你给的样式,稍微规整下:

.one {
  padding: 50px;
  background: tomato;
  margin: 10px;
  color: white;
}
.two {
  padding: 50px;
  background: navy;
  margin: 10px;
  color: white;
}
#downloadBtn {
  padding: 10px 20px;
  cursor: pointer;
  margin: 10px;
}

jQuery类封装的核心逻辑

咱们把所有逻辑封装成一个类,方便复用和维护:

class DivToZipExporter {
  constructor(divSelector, buttonSelector) {
    this.divs = $(divSelector);
    this.downloadBtn = $(buttonSelector);
    this.init();
  }

  // 初始化:绑定按钮点击事件
  init() {
    this.downloadBtn.on('click', () => this.startExport());
  }

  // 开始导出流程:转图片 -> 打包Zip -> 下载
  async startExport() {
    try {
      const imageBlobs = await this.convertDivsToImages();
      await this.createAndDownloadZip(imageBlobs);
      alert('下载完成!');
    } catch (error) {
      console.error('导出失败:', error);
      alert('导出出错了,请查看控制台日志');
    }
  }

  // 将每个Div转为图片Blob
  async convertDivsToImages() {
    const blobs = [];
    for (let i = 0; i < this.divs.length; i++) {
      const div = this.divs[i];
      // 用html2canvas把Div转为Canvas
      const canvas = await html2canvas(div, {
        scale: 2, // 提高图片清晰度
        useCORS: true // 处理跨域图片(如果Div里有外部图片的话)
      });
      // 把Canvas转为Blob对象
      const blob = await new Promise(resolve => canvas.toBlob(resolve, 'image/png'));
      blobs.push({
        blob: blob,
        filename: `div-${i+1}.png` // 给每个图片命名
      });
    }
    return blobs;
  }

  // 创建Zip并下载
  async createAndDownloadZip(imageBlobs) {
    const zip = new JSZip();
    // 把每个图片Blob加入Zip
    imageBlobs.forEach(item => {
      zip.file(item.filename, item.blob);
    });
    // 生成Zip文件的Blob
    const zipBlob = await zip.generateAsync({ type: 'blob' });
    // 触发浏览器下载
    saveAs(zipBlob, 'div-images.zip');
  }
}

// 初始化导出器:传入要导出的Div选择器和按钮选择器
$(document).ready(() => {
  new DivToZipExporter('.one, .two', '#downloadBtn');
});

代码说明

  • 类封装:DivToZipExporter类把所有逻辑打包,你只需要初始化时传入Div的选择器和按钮选择器就行,非常灵活
  • html2canvas配置:scale:2是为了让导出的图片更清晰,useCORS:true解决Div里有跨域图片的问题
  • 异步处理:因为转图片和打包Zip都是异步操作,所以用了async/await让代码更易读
  • 错误处理:加入了try/catch捕获错误,避免页面崩溃,还给出友好提示

这样你点击按钮后,就能把所有目标Div转成PNG图片,打包成一个Zip文件下载啦!

内容的提问来源于stack exchange,提问作者johnny555

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:49:07