0
积极分子
点赞 + 收藏 === 学会🤣🤣🤣
日常开发中,导出带滚动条的DOM内容为图片时,普通截图只能抓可视区域?本文分享基于@snapdom的长截图方案,完美导出完整内容,还能精准复刻UI~
开发中经常遇到「导出带滚动区域的DOM为图片」的需求(比如评估报告、图表列表、长表单),普通方案的问题:
✅ 解决方案:使用第三方库@zumer/snapdom,直接将DOM节点完整渲染为Canvas,完美解决以上问题。
@zumer/snapdom
使用第三方库snapdom 核心是模拟浏览器渲染引擎,将指定DOM节点(包括子节点、滚动隐藏区域)完整转换为Canvas,从而生成长截图:
snapdom
overflow
DOM 结构隔离:
<div>
contentRef
执行截图:
snapdom.toCanvas(contentRef.current)
下载文件:
<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); } };
如果要求导出的UI和页面上的不一致,可以新建一个专门用来导出的组件,隐藏在页面上的某个地方。
使用道具 举报
本版积分规则 发表回复 回帖并转播 回帖后跳转到最后一页
相关侵权、举报、投诉及建议等,请发 E-mail:qiongdian@foxmail.com
Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.