vue使用html2canvas生成图片实现方式

 更新时间:2026年03月23日 09:10:37   作者:木子静静  
这篇文章主要介绍了vue使用html2canvas生成图片实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

1.安装html2canvas插件

npm install --save html2canvas

2.在需要用到的.vue文件中引入

import html2canvas from 'html2canvas'

3.代码片段

说明:

  • 如果要被生成图片的dom是超出屏幕需要滚动才能查看的话,
  • 需要加上width,height windowWidth,windowHeight 这些属性才能保证截图的完整性,
  • windowHeight的值用document.body.scrollHeight也行,具体看需求如何。
<template>
	<div>
		<button @click="createImg">生成图片并下载到本地</button>
		<button @click="saveImg">生成图片并上传到服务器</button>
		<div ref="content" style="width:200px;height:200px;border:1px solid #333333;">
			此dom是要被保存成图片的
		</div>
	</div>
</template>
<script>
	import html2canvas from 'html2canvas'
	export default {
		data(){
			return {
			}
		},
		methods:{
			createImg(){
				let content = this.$refs.content
				let scrollHeight = content.scrollHeight
				let scrollWidth = content.scrollWidth
				html2canvas(content,{
						scale: window.devicePixelRatio*2,
						useCORS: true , //开启跨域配置,但和allowTaint不能共存
						width:scrollWidth,
						height:scrollHeight,
						windowWidth:scrollWidth,
						windowHeight:scrollHeight,
						x:0,
						y:window.pageYOffset
					}).then((canvas) => {
						this.operType = 'edit'
						let dataURL = canvas.toDataURL("image/jpg");
						let link = document.createElement("a");    
						link.href = dataURL;
						let filename = `${new Date().getTime()}.jpg`;  //文件名称
						link.setAttribute("download", filename);
						link.style.display = "none"; //a标签隐藏
						document.body.appendChild(link);
						link.click();
					})
			},
			saveImg(){
				html2canvas(this.$refs.content,{
					scale: window.devicePixelRatio*2,
					useCORS: true , //开启跨域配置,但和allowTaint不能共存
					width:content.scrollWidth,
					height:content.scrollHeight,
					windowWidth:content.scrollWidth,
					windowHeight:content.scrollHeight,
					x:0,
					y:window.pageYOffset
				}).then((canvas) => {
					let dataURL = canvas.toDataURL("image/png");
					this.operType = 'edit'
					let filename = `${new Date().getTime()}.png`;
					let file_url = dataURLtoFile(dataURL, filename,"image/png"); //将文件转换成file的格式,就可以使用file_url传递给服务端了
					
					let formData = new FormData()
					formData.append('file',file_url)
					
					//这个uploadFile 根据自己上传接口的名字写
					uploadFile(formData).then(res=>{
						//此处具体业务具体操作
					})
				});
			},
			//将base64格式转换成file的格式
			dataURLtoFile(base64, filename,contentType) { 
				let arr = base64.split(',')  //去掉base64格式图片的头部
				let bstr = atob(arr[1])   //atob()方法将数据解码
				let leng = bstr.length
				let u8arr = new Uint8Array(leng)
				while(leng--){
					u8arr[leng] =  bstr.charCodeAt(leng) //返回指定位置的字符的 Unicode 编码
				}
				return new File([u8arr],filename,{type:contentType}) 
			}
		}
	}
</script>

具体的属性可以参考官方文档

4.小记

//1. 生成的背景默认为白色,可以通过 backgroundColor 属性修改背景颜色
html2canvas(this.$refs.content, {
  backgroundColor: null // null 表示设置背景为透明色
}.then(img => {});

//2.截图有时会错位,是因为不支持某些css属性造成的,调整css样式即可,有时margin 也会有影响。

5.补充

在移动端H5使用中,会有ios截图失效问题,目前的解决方案是 修改html2canvas版本为1.0.0

调用方法如下:

    (window.html2canvas || html2canvas)(content,
    {
      scale: window.devicePixelRatio, //window.devicePixelRatio * 2
      useCORS: true, //开启跨域配置,但和allowTaint不能共存
      width: scrollWidth,
      height: scrollHeight,
      windowWidth: scrollWidth,
      windowHeight: scrollHeight,
      x: 0,
      y: 0
    }).then(canvas => {
      let url = canvas.toDataURL("image/jpg");
      console.log(url)
      this.picUrl = url
    })
    .catch(err => {
      // do sth
    });

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 基于IView中on-change属性的使用详解

    基于IView中on-change属性的使用详解

    下面小编就为大家分享一篇基于IView中on-change属性的使用详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-03-03
  • 浅谈mvvm-simple双向绑定简单实现

    浅谈mvvm-simple双向绑定简单实现

    本篇文章主要介绍了浅谈mvvm-simple双向绑定简单实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • 3分钟读懂移动端rem使用方法(推荐)

    3分钟读懂移动端rem使用方法(推荐)

    这篇文章主要介绍了rem使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-05-05
  • Vue+TailWindcss实现一个简单的闯关小游戏

    Vue+TailWindcss实现一个简单的闯关小游戏

    本文将利用Vue+TailWindcss实现一个简单的闯关小游戏,玩家须躲避敌人与陷阱到达终点且拥有多个关卡,感兴趣的小伙伴可以了解一下
    2022-04-04
  • Vue3使用exceljs将excel文件转化为html预览最佳方案

    Vue3使用exceljs将excel文件转化为html预览最佳方案

    在企业应用中,我们时常会遇到需要上传并展示 Excel 文件的需求,以实现文件内容的在线预览,经过一番探索与尝试,笔者最终借助 exceljs 这一库成功实现了该功能,本文将以 Vue 3 为例,演示如何实现该功能,需要的朋友可以参考下
    2025-05-05
  • Vue3定义全局变量的方式总结(附代码)

    Vue3定义全局变量的方式总结(附代码)

    vue创建全局变量和方法有很多种,下面这篇文章主要给大家介绍了关于Vue3定义全局变量的方式,文中通过代码介绍的非常详细,对大家学习或者使用vue3具有一定的参考借鉴价值,需要的朋友可以参考下
    2024-04-04
  • vue中动态设置meta标签和title标签的方法

    vue中动态设置meta标签和title标签的方法

    这篇文章主要介绍了vue中动态设置meta标签和title标签的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Vue3实现密码加密登录的示例代码

    Vue3实现密码加密登录的示例代码

    现在,很多登陆表单都会使用密码加密,为登录安全,登录表单输入密码,会加密后传入后台,本文就来介绍一下Vue3实现密码加密登录的示例代码,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • vue computed计算属性显示undefined的解决

    vue computed计算属性显示undefined的解决

    这篇文章主要介绍了vue computed计算属性显示undefined的解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • 详解Vue中使用Axios拦截器

    详解Vue中使用Axios拦截器

    这篇文章主要Vue使用Axios拦截器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04

最新评论