当前位置: 首页 > news >正文

vue3+ts使用html2canvas,实现页面截图

最近在开发中遇到了一个功能把弹框中的表格转为一张图片进行预览,而html2canvas 库可以帮我们实现这一需求,它能将 HTML 元素渲染为 Canvas,进而生成图片。下面就来详细介绍如何在 Vue3 + TS 项目中使用 html2canvas 实现页面截图并下载功能。

准备工作

首先,需要安装 html2canvas 库。打开终端,在项目根目录下执行以下命令:

npm install html2canvas

功能实现代码解析

以下是实现页面截图并下载功能的核心代码:

const openCard = () => {JBLoding.value = true;const scale: any = sessionStorage.getItem('scaleNum') || 1;const element = cardTableRef.value;element.style.letterSpacing = '0.5px';html2canvas(cardTableRef.value, {backgroundColor: 'white',scale: 2}).then(function (canvas) {const margin = 20;const newCanvas = document.createElement('canvas');newCanvas.width = canvas.width + 2 * margin;newCanvas.height = canvas.height + 2 * margin;const ctx = newCanvas.getContext('2d');if (ctx) {ctx.font = 14 * scale + 'px';ctx.fillStyle = 'white';ctx.fillRect(0, 0, newCanvas.width, newCanvas.height);ctx.drawImage(canvas, margin, margin);}commonJs.downloadImage(newCanvas, '卡片.png');element.style.letterSpacing = 'unset';JBLoding.value = false;});
};

在这里插入图片描述

分解代码

const scale: any = sessionStorage.getItem('scaleNum') || 1;

首先是页面,如果你的页面上有整体页面的缩放,那么在你进行设置缩放的时候建议设置一个变量或者存入sessionStorage中,有什么用呢?用作于字体大小,在页面的缩放等比下 ,用你系统全局的字体号去乘以缩放比例就可以获取到实时的字体大小。

    const margin = 20;const newCanvas = document.createElement('canvas');newCanvas.width = canvas.width + 2 * margin;newCanvas.height = canvas.height + 2 * margin;

如果下载的图片需要边距的话就需要给这个画布多加的宽度* 2,也就是说留边距20px那么就是宽度需要20 * 2高度同样的,宽高+40。不需要加边距则忽略。

目标元素样式调整

const element = cardTableRef.value;element.style.letterSpacing = '0.5px';

为何需要设置字间距?原因是下载的图片字间距大小不一,单词或者词语之间字间距的间距过大,所以通过 cardTableRef 获取到要进行截图的目标元素 element,并调整其字母间距为 0.5px,使截图内容的文字间距统一。在截图操作完成后,又将字母间距设置为 unset,恢复元素原来的样式。当然在设置样式的时候页面也会随着进行变化,此时我们可以加一个加载的动画

JBLoding.value = true; //下载显示
JBLoding.value = false; //下载完成隐藏

在现在完成后我们把加载动画关闭掉就可以了 。这样就避免了页面跳动和图片下载等待尴尬期。

(注:仅限于参考学习,如有更好的方法欢迎讨论)


文章转载自:

http://eTiIsswf.ghpLd.cn
http://JcOCJ0t0.ghpLd.cn
http://1UQOSsCl.ghpLd.cn
http://vLdmDAao.ghpLd.cn
http://HD7u8mTb.ghpLd.cn
http://QomZpnk1.ghpLd.cn
http://ZJ5VcsWJ.ghpLd.cn
http://QHtExfqd.ghpLd.cn
http://tGaMuGTh.ghpLd.cn
http://SuUqTy83.ghpLd.cn
http://XzrCKHJK.ghpLd.cn
http://YhDNX7D5.ghpLd.cn
http://RWQmcpHL.ghpLd.cn
http://Zi7T67wZ.ghpLd.cn
http://feCmwa1t.ghpLd.cn
http://mU4pAWVU.ghpLd.cn
http://OCnhlRm8.ghpLd.cn
http://2bBD5QzI.ghpLd.cn
http://F29CRV1U.ghpLd.cn
http://f9xTcuy8.ghpLd.cn
http://P78cjRjg.ghpLd.cn
http://sCakXpdU.ghpLd.cn
http://gegfThaO.ghpLd.cn
http://zjLLPyHj.ghpLd.cn
http://kUewhJgL.ghpLd.cn
http://Tp6Ww4vs.ghpLd.cn
http://qILDU5mq.ghpLd.cn
http://rKOw0Ozp.ghpLd.cn
http://aiaxf24Y.ghpLd.cn
http://TQ77n9wb.ghpLd.cn
http://www.dtcms.com/a/372760.html

相关文章:

  • 疾病语音数据集 WAV格式音频
  • 07 下载配置很完善的yum软件源
  • 【PCIe EP 设备入门学习专栏 -- 8.2.2 PCIe EP Controller Register Types 介绍】
  • 排序---冒泡排序(Bubble Sort)
  • C++/QT day8(9.8)
  • 【Linux网络编程】传输层协议-----UDP协议
  • 医疗连续体机器人模块化控制界面设计与Python库应用研究(上)
  • 分享|构建产教融合的一体化人工智能实验室综合解决方案
  • 从固定 px 到响应式:Vue + Vite 项目响应式改造实战,解决前端不适配的问题
  • java面试:了解MVCC么,详细解释一下
  • ChatGPT 协作调优:把 SQL 查询从 5s 优化到 300ms 的全过程
  • 长春高新需要新叙事
  • Python用PSO优化SVM与RBFN在自动驾驶系统仿真、手写数字分类应用研究
  • android studio JNI 环境配置实现 java 调用 c/c++
  • 安卓非原创--基于Android Studio 实现的新闻App
  • Flutter Android Studio开发实用技巧
  • Android Studio适配butterknife遇到的坑
  • 论文精读(五):面向链接预测的知识图谱表示学习方法综述
  • 使用AI工具一句话生成PPT
  • 《嵌入式硬件(五):IMX6ULL所需的基础》
  • Vue响应式更新 vs React状态更新:两种范式的底层逻辑与实践差异
  • Qt UDP 网络编程详解
  • CUPP针对性字典安全防范
  • 用nasm汇编器汇编不同位数格式的ELF
  • odoo打印pdf速度慢问题
  • 京东商品评论 API(JSON 数据返回)核心解析
  • SpringMVC(二)
  • 开始理解大型语言模型(LLM)所需的数学基础
  • 搭论文大纲逻辑乱易跑题?AI 3 步梳理框架,自动串逻辑链
  • C#SqlSugar的简单使用