前端实现带滚动区域的DOM长截图导出完整步骤

 更新时间:2026年02月11日 09:40:32   作者:小小闹钟  
前端实现截图功能有多种方式,开发中实现截图也是常见的功能需求,这篇文章主要介绍了前端实现带滚动区域的DOM长截图导出的相关资料,文中给出了详细的代码示例,需要的朋友可以参考下

日常开发中,导出带滚动条的DOM内容为图片时,普通截图只能抓可视区域?本文分享基于@snapdom的长截图方案,完美导出完整内容,还能精准复刻UI~

一、业务痛点(为什么选snapdom?)

开发中经常遇到「导出带滚动区域的DOM为图片」的需求(比如评估报告、图表列表、长表单),普通方案的问题:

  • ❌ 仅能截取可视区域,滚动隐藏的内容丢失;
  • ❌ Canvas绘制易出现样式错乱(字体、颜色、布局偏差);
  • ❌ 手动计算滚动高度复杂,适配成本高。

✅ 解决方案:使用第三方库@zumer/snapdom,直接将DOM节点完整渲染为Canvas,完美解决以上问题。

二、核心原理

使用第三方库snapdom 核心是模拟浏览器渲染引擎,将指定DOM节点(包括子节点、滚动隐藏区域)完整转换为Canvas,从而生成长截图:

  1. 解析DOM节点的完整布局(包括overflow滚动区域的实际高度);
  2. 复刻节点的所有样式(CSS、字体、图片、背景色);
  3. 按真实尺寸渲染为Canvas,支持高分辨率导出;
  4. 最终将Canvas转换为图片并下载。

解决的关键问题

  • 完整内容导出:内容较多时会出现滚动条,普通的截图方式只能截取可视区域。snapdom 可以渲染整个 DOM 节点的高度。

实现步骤

  1. DOM 结构隔离

    • 将需要导出的内容(图表列表 + 截图历史)包裹在一个独立的 <div> 中,并绑定 contentRef
  2. 执行截图

    • 点击导出按钮时,调用 snapdom.toCanvas(contentRef.current)
    • 库会自动计算节点的完整尺寸(包括溢出/滚动部分)进行绘制。
  3. 下载文件

    • 将生成的 Canvas 转换为 Data URL。
    • 动态创建一个 <a> 标签,设置 download 属性和 href,触发点击事件下载图片。

关键代码

结构:

{/* 导出目标容器(ref={contentRef}) */}
 <div ref={reportContentRef} className="export-container">
      <ReportHeader reportData={reportData} />
      <FirstTab reportData={reportData} isExport={isExport} />
      <SecondTab reportData={reportData} mapUrl={mapUrl} isExport={isExport} />
      <ThirdTab reportData={reportData} isExport={isExport} />
      <ReportFooter />
    </div>

导出逻辑:

 // 导出报告为图片
  const handleExportReport = async () => {
    if (!reportContentRef.current) {
      message.error('无法获取报告内容');
      return;
    }
    try {
      setExportLoading(true);
      // 使用 @zumer/snapdom 组件实现 html转canvas
      const contentCanvas = await snapdom.toCanvas(reportContentRef.current, {
        // 配置选项
        dpr: 3,
        scale: 2,
        backgroundColor: '#e7f0fa',
      });

      // 转换为图片数据URL
      const dataUrl = contentCanvas.toDataURL('image/png');

      // 下载截图
      const link = document.createElement('a');
      link.download = `${reportData?.createTime}${reportData?.stationName}评估报告.jpg`;
      link.href = dataUrl;
      link.click();
      link.remove();

      message.success('报告导出成功');
      setExportLoading(false);
    } catch (error) {
      message.error('报告导出失败,请重试');
      setExportLoading(false);
    }
  };

优势

  • 所见即所得(甚至更多) :能够导出包含滚动区域在内的所有内容。
  • 纯净输出:通过 Ref 精确锁定内容区域,自动过滤掉按钮和无关 UI。
  • 速度很快:比传统手动 Canvas 绘制快 30%+,点击导出即刻触发下载,用户体验流畅。

如果要求导出的UI和页面上的不一致,可以新建一个专门用来导出的组件,隐藏在页面上的某个地方。

总结

到此这篇关于前端实现带滚动区域的DOM长截图导出的文章就介绍到这了,更多相关前端滚动区域DOM长截图导出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • js获得地址栏?问号后参数的方法

    js获得地址栏?问号后参数的方法

    这篇文章介绍了js获得地址栏?问号后参数的方法,有需要的朋友可以参考一下
    2013-08-08
  • 微信小程序中slot插槽基本使用方法实例

    微信小程序中slot插槽基本使用方法实例

    之前竟然听到有人跟我说微信小程序没有组件插槽功能,下面这篇文章主要给大家介绍了关于微信小程序中slot插槽基本使用方法的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • Google 爬虫如何抓取 JavaScript 的内容

    Google 爬虫如何抓取 JavaScript 的内容

    我们测试了谷歌爬虫是如何抓取 JavaScript,下面就是我们从中学习到的知识,需要的朋友可以参考下
    2017-04-04
  • JS匹配日期和时间的正则表达式示例

    JS匹配日期和时间的正则表达式示例

    这篇文章主要介绍了JS匹配日期和时间的正则表达式,结合实例形式分析了JS匹配日期、时间及日期+时间等时间格式的相关实现技巧,需要的朋友可以参考下
    2017-05-05
  • 理解JS绑定事件

    理解JS绑定事件

    这篇文章主要帮助大家深入理解JS绑定事件,介绍了六种JS绑定事件的情况,感兴趣的小伙伴们可以参考一下
    2016-01-01
  • JavaScript使用RegExp进行正则匹配的方法

    JavaScript使用RegExp进行正则匹配的方法

    这篇文章主要介绍了JavaScript使用RegExp进行正则匹配的方法,实例分析了RegExp对象在进行正则匹配时的相关使用技巧,需要的朋友可以参考下
    2015-07-07
  • javascript文件加载管理简单实现方法

    javascript文件加载管理简单实现方法

    这篇文章主要介绍了javascript文件加载管理简单实现方法,可实现顺序加载所有js文件的功能,非常简单实用,需要的朋友可以参考下
    2015-07-07
  • 常用javascript表单验证汇总

    常用javascript表单验证汇总

    这篇文章主要介绍了一些常用javascript表单验证,文章最后还附带了一个实践案例,以验证数字为例进行讲解,感兴趣的小伙伴们可以参考一下
    2015-11-11
  • JS+CSS实现的经典tab选项卡效果代码

    JS+CSS实现的经典tab选项卡效果代码

    这篇文章主要介绍了JS+CSS实现的经典tab选项卡效果代码,通过简单的鼠标事件触发js函数实现针对页面元素的遍历与样式变换功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • js实现的四级左侧网站分类菜单实例

    js实现的四级左侧网站分类菜单实例

    这篇文章主要介绍了js实现的四级左侧网站分类菜单,实例分析了javascript操作页面元素实现tab切换的相关技巧,需要的朋友可以参考下
    2015-05-05

最新评论