前端实现带滚动区域的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长截图导出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • JavaScript localStorage使用教程详解

    JavaScript localStorage使用教程详解

    JavaScriptlocalStorage基本上是浏览器Window对象中的存储,您可以在中存储任何内容localStorage,localStorage及其相关的sessionStorage是 Web Storage API的一部分,我们将在本文详细了解这些,需要的朋友可以参考下
    2023-06-06
  • JS异步文件分片断点上传的实现思路

    JS异步文件分片断点上传的实现思路

    在项目中有时会遇到大文件上传,经常会出现链接超时的问题,所以就需要使用文件分片上传的方式来上传大文件。下面通过本文给大家介绍js异步文件分片断点上传的实例代码,需要的的朋友参考下吧
    2016-12-12
  • JS正则表达式验证密码格式的集中情况总结

    JS正则表达式验证密码格式的集中情况总结

    这篇文章主要介绍了JS正则表达式验证密码格式的集中情况总结,需要的朋友可以参考下
    2017-02-02
  • javascript实现的淘宝旅行通用日历组件用法实例

    javascript实现的淘宝旅行通用日历组件用法实例

    这篇文章主要介绍了javascript实现的淘宝旅行通用日历组件,以实例形式分析了该日历组件的相关设置及使用技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 如何在JavaScript中运行.NET Core代码详情

    如何在JavaScript中运行.NET Core代码详情

    这篇文章主要介绍了在JavaScript中运行.NET Core代码详情,DotNetJS可以将C#项目编译为与任何环境兼容的单文件JavaScript库,变可以在JavaScript中运行.NET Core代码,相关操作分享详情,需要的小伙伴可以参考一下
    2022-04-04
  • layui的table中显示图片方法

    layui的table中显示图片方法

    今天小编就为大家分享一篇layui的table中显示图片方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-08-08
  • 鼠标拖动改变DIV等网页元素的大小的实现方法

    鼠标拖动改变DIV等网页元素的大小的实现方法

    下面小编就为大家带来一篇鼠标拖动改变DIV等网页元素的大小的实现方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • JavaScript控制两个列表框listbox左右交换数据的方法

    JavaScript控制两个列表框listbox左右交换数据的方法

    这篇文章主要介绍了JavaScript控制两个列表框listbox左右交换数据的方法,实例分析了javascript操作列表框listbox的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-03-03
  • JavaScript数组与对象过滤方法的完全指南

    JavaScript数组与对象过滤方法的完全指南

    本文系统介绍了JavaScript中的数组和对象过滤方法,数组过滤包括filter()、find()、findIndex()等常用方法,以及every()和some()等条件检测方法;对象过滤涵盖键值过滤、深度过滤等技巧,文章还提供了高级过滤技巧,需要的朋友可以参考下
    2026-04-04
  • js中调用微信的扫描二维码功能的实现代码

    js中调用微信的扫描二维码功能的实现代码

    这篇文章主要介绍了在js中调用微信的扫描二维码功能的实现代码,本文给大家分享了注意事项及常见问题分析,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04

最新评论