vue3 中html2canvas用法(屏幕截图)

前言

vue2和vue3用法大致相同,可以直接套用

步骤

1.引入依赖

npm i html2canvas

2.导入方式

import html2canvas from "html2canvas";

3.代码示例

// html
<el-button @click="generateImg">下载pdf</el-button>
<div>
  // 滑动状态也可全部截图
  <el-scrollbar>
    <div id="test-id">
        <img src="@img/admin_logo.jpg" alt="" />
        <div>
          <div>今天是个好天气</div>
          <div>测试截图中</div>
          <div>最后一行</div>
        </div>
    </div>
  </el-scrollbar>
</div>

 // js
 const generateImg = ()=>{
	let el = document.getElementById("test-id");
	let options = {
        width: el.offsetWidth,
        height: el.offsetHeight,
        useCORS: true, // 是否尝试使用 CORS 从服务器加载图像
        allowTaint: false, // 是否允许跨源图像污染画布
	}
	
	html2canvas(el, opts).then((canvas) => {
       let imgData = canvas.toDataURL("image/jpeg"); // 转base64
       fileDownload(imgData);
    });
 };
    
 // 下载图片方法
 const fileDownload = (downloadUrl) => {
	let aLink = document.createElement("a");
	aLink.style.display = "none";
	// 以防base64过长导致下载失败,所以将base64转成blob格式
	aLink.href = URL.createObjectURL(dataURIToBlob(downloadUrl));
	aLink.download = "img.png";
	document.body.appendChild(aLink);
	aLink.click();
	document.body.removeChild(aLink);
 };

 // base64转blob方法
 const dataURIToBlob = (dataURI) => {
	let binStr = atob(dataURI.split(",")[1]),
    len = binStr.length,
	arr = new Uint8Array(len);
    
	for (var i = 0; i < len; i++) {
		arr[i] = binStr.charCodeAt(i);
	}
	return new Blob([arr]);
 };
<think>好的,我现在需要帮助用户解决在Uni-app中使用html2canvas生成海报的问题。首先,我得回忆一下用户提到的几个引用内容,看看有没有相关的信息可以利用。引用1和2提到了使用html2canvas库来生成海报,但用户可能遇到了一些问题,比如如何正确引入和使用。引用3和4则涉及到Uni-app中Canvas组件的使用以及自定义海报组件的实现步骤,特别是动态生成元素和图片合成的方法。 首先,用户想要的是一个示例教程,所以需要提供一个清晰的步骤指南。根据引用4,生成海报的步骤包括动态生成元素、图片合成、自定义样式和长按保存。结合引用1中的引入html2canvas的方法,我应该先指导用户安装和引入这个库。但需要注意的是,Uni-app的环境可能和普通网页不同,可能需要处理跨平台兼容性问题,比如H5和小程序的区别。 接下来,用户可能需要一个基础示例的结构。引用3提到了一些常见的错误,比如没有正确传入组件实例或生命周期的问题,所以在示例代码中需要确保在onReady或onMounted生命周期中初始化Canvas。此外,生成海报后保存图片的方法也需要参考引用4中的长按保存功能,使用uni.saveImageToPhotosAlbum。 然后,要考虑用户可能遇到的兼容性问题。引用2指出,现有的插件可能不符合需求,所以需要强调动态生成元素的方法,让用户可以根据自己的设计调整结构和样式。同时,引用3中的注意事项,比如canvas-id的设置和2D上下文的处理,应该在步骤中提醒用户避免常见错误。 最后,生成相关问题时要围绕用户的需求扩展,比如性能优化、动态内容处理、跨平台兼容性等,这些都是用户在实际开发中可能遇到的后续问题。需要确保这些相关问题能帮助用户进一步深入学习和解决问题。</think>以下是在Uni-app中使用html2canvas生成海报的完整实现步骤和示例: ### 一、基础实现步骤 1. **安装依赖** ```bash npm install html2canvas --save ``` 2. **创建海报容器** ```vue <template> <view> <view id="posterBox" class="poster-container"> <!-- 自定义海报内容 --> <image src="/static/logo.png" class="header-image"/> <text class="title">{{ title }}</text> </view> <canvas canvas-id="myCanvas" class="canvas-box"></canvas> </view> </template> ``` 3. **核心生成函数** ```javascript import html2canvas from &#39;html2canvas&#39;; export default { data() { return { title: "夏日促销海报" } }, methods: { async generatePoster() { // 获取DOM节点 const element = document.getElementById(&#39;posterBox&#39;); // 生成Canvas const canvas = await html2canvas(element, { useCORS: true, // 允许跨域图片 scale: 2, // 提高分辨率 backgroundColor: null }); // 转换为临时路径 const tempFilePath = canvas.toDataURL(); // 保存到本地 uni.saveImageToPhotosAlbum({ filePath: tempFilePath, success: () => uni.showToast({ title: &#39;保存成功&#39; }), fail: (err) => console.error(err) }); } } } ``` ### 二、关键注意事项 1. **跨平台兼容性**: - H5端可直接使用DOM操作 - 小程序端需通过`uni.createSelectorQuery()`获取节点信息[^3] - 需要处理不同端的图片域名白名单 2. **样式处理技巧**: ```css .poster-container { width: 750rpx; height: 1334rpx; position: absolute; left: -9999px; /* 隐藏原始容器 */ } .canvas-box { width: 100%; height: 100vh; } ``` 3. **性能优化方案**: - 预加载所有图片资源 - 使用`will-change: transform`提升渲染性能 - 对静态内容进行缓存处理[^4] ### 三、完整示例代码 ```vue <script> export default { onReady() { this.generatePoster(); }, methods: { async generatePoster() { try { const res = await html2canvas(document.querySelector(&#39;#posterBox&#39;), { allowTaint: true, logging: true }); uni.previewImage({ urls: [res.toDataURL()], current: 0 }); } catch (e) { console.error(&#39;生成失败:&#39;, e); } } } } </script> ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值