使用vue实现HTML页面生成图片的方法


Posted in Javascript onMarch 12, 2020

随着网络的发展,越来越多的网络平台应运而生。如何获得更多的流量,吸引更多的眼球已经成为网络平台生存、发展的必要条件。现在网络平台最常见的一种宣传方式就是人邀人。

我最近就接到一个需求,做一个 海报页面,并且能保存到手机 ,方便用户分享给朋友,希望能够达到人邀人的效果。

使用vue实现HTML页面生成图片的方法 

给人第一感觉这个需求就是保存图片的功能,当时梳理是却发现不是那么简单:

  1.动态生成一张带logo的二维码
  2.整个海报的html部分转化成图片
  3.保存图片至手机相册

生成带logo的二维码

用 vue_qrcodes 生成带logo的二维码

安装

npm install vue_qrcodes -- save

使用

<!--部分html代码-->
<qrcode :url="qrcodeUrl"
 :iconurl="iconurl"
 :wid="298"
 :hei="278"
 :imgwid="100"
 :imghei="100">
</qrcode>

// 部分js代码
import qrcode from 'vue_qrcodes'
//...省略其他代码
components: {
 qrcode
 }

问题来了:二维码出现了,但是二维码和logo大小并不是你想要,无法自适应。那就需要我们重置二维码和logo的样式。

.logoimg {
 height: 100px !important;
 width: 100px !important;
 margin-top: -50px !important;
 margin-left: -50px !important;
 }
#qrcode {
 margin-top: 20px;
 img {
 height: 278px !important;
 width: 298px !important;
 }
 }

html转化为base64图片

html转化为canvas中我选用组件 html2canvas

yarn add html2canvas

import html2canvas from 'html2canvas'

为了防止页面有闪屏我用了两个div,一个存放原来的dom,一个存放canvas的生成的图片,再v-if控制展示的元素。

使用vue实现HTML页面生成图片的方法 

js调用函数:

htmlToCanvas() {
 html2canvas(this.$refs.bill, {})
 .then((canvas) => {
 let imageUrl = canvas.toDataURL('image/png'); // 将canvas转成base64图片格式
 this.canvasImageUrl = imageUrl;
 this.isDom = false;
 });
}
// 二维码地址
this.qrcodeUrl = data.data.inviteCodeAddress
// 调用html转化canvas函数
this.htmlToCanvas();

结果如图:

使用vue实现HTML页面生成图片的方法 

页面转化成了图片,但是二维码没有展示出来,控制台报错:

使用vue实现HTML页面生成图片的方法 

除二维码其他部分已经转化为图片,二维码不显示,原因有两种可能:

转化时二维码还没有加载完成

转化二维码的过程中报错了

首先尝试了nextTick

使用 nextTick 将回调延迟到下次DOM更新循环之后执行

// 二维码地址
this.qrcodeUrl = data.data.inviteCodeAddress 
this.$nextTick(() => {
 // 跳用html转化canvas函数
 this.htmlToCanvas(); 
 })

使用vue实现HTML页面生成图片的方法 

发现二维码出来了,但是二维码的大小不对,并且控制台还是存在报错。虽然问题没有完全解决,但是二维码出现了。可以证明二维码不展示的原因是,转化时二维码没有加载完成。

再尝试使用setTimeout

使用 setTimeout 将回调延迟到指定时间之后执行

// 二维码地址
this.qrcodeUrl = data.data.inviteCodeAddress 
setTimeout(()=>{
 // 调用html转化canvas函数
 this.htmlToCanvas(); 
}, 200)

查看效果:

使用vue实现HTML页面生成图片的方法 

注:setTimeout是我目前能想到延迟加载方法。各位大佬们,如果这个有更好的方法解决上面的问题,麻烦给留言,在此谢过。

页面正常,控制台没有报错,可是logo没有展示出来。

logo地址是:

iconurl: 'https://static.daojia.com/assets/project/tosimple-pic/LOGO_1576564983633.png',

项目在本地启动,可能存在跨域问题。

htmlToCanvas() {
 html2canvas(this.$refs.bill, {
 useCORS: true // 解决图片跨域问题
 }).then((canvas) => {
 // 将canvas转成base64图片格式
 let imageUrl = canvas.toDataURL('image/png'); 
 this.canvasImageUrl = imageUrl;
 this.isDom = false;
 }).catch((e) => console.log(e));
 }

至此html成功转化为图片。

图片保存至手机

首先尝试了JS-SDK中的下载图片downloadImage
经过各种尝试并不能实现。

最后采用的是微信长按保存图片

海报部分已经转化为图片,无需再开发,只要提示用户长按图片可以保存即可。

使用vue实现HTML页面生成图片的方法 

总结

到此这篇关于使用vue实现HTML页面生成图片的文章就介绍到这了,更多相关vue html页面生成图片内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Javascript 相关文章推荐
javascript function调用时的参数检测常用办法
Feb 26 Javascript
javascript淡入淡出效果的实现思路
Mar 31 Javascript
jquery实现输入框动态增减的实例代码
Jul 14 Javascript
基于jquery实现的自动补全功能
Mar 12 Javascript
详解JavaScript中数组的相关知识
Jul 29 Javascript
angular 基于ng-messages的表单验证实例
May 04 Javascript
laravel5.4+vue+element简单搭建的示例代码
Aug 29 Javascript
解决vue打包项目后刷新404的问题
Mar 06 Javascript
去掉vue 中的代码规范检测两种方法(Eslint验证)
Mar 21 Javascript
jQuery实现的点击标题文字切换字体效果示例【测试可用】
Apr 26 jQuery
js中的 || 与 &amp;&amp; 运算符详解
May 24 Javascript
vue form check 表单验证的实现代码
Dec 09 Javascript
JavaScript实现随机点名器
Mar 25 #Javascript
JavaScript碰撞检测原理及其实现代码
Mar 12 #Javascript
JavaScript实现多个物体同时运动
Mar 12 #Javascript
基于javascript实现碰撞检测
Mar 12 #Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
Mar 12 #jQuery
js 使用ajax设置和获取自定义header信息的方法小结
Mar 12 #Javascript
javascript实现拖拽碰撞检测
Mar 12 #Javascript
You might like
制作美丽的拉花
2021/03/03 冲泡冲煮
PHP+MYSQL的文章管理系统(二)
2006/10/09 PHP
一步一步学习PHP(6) 面向对象
2010/02/16 PHP
利用中国天气预报接口实现简单天气预报
2014/01/20 PHP
用Javascript实现锚点(Anchor)间平滑跳转
2009/09/08 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
2013/04/27 Javascript
细说javascript函数从函数的构成开始
2013/08/29 Javascript
页面定时刷新(1秒刷新一次)
2013/11/22 Javascript
javascript确认框的三种使用方法
2013/12/17 Javascript
JQuery中dataGrid设置行的高度示例代码
2014/01/03 Javascript
ExtJS中设置下拉列表框不可编辑的方法
2014/05/07 Javascript
js实现网页右上角滑出会自动消失大幅广告的方法
2015/02/27 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
浅谈JavaScript中的分支结构
2016/07/01 Javascript
jQuery Pagination分页插件使用方法详解
2017/02/28 Javascript
在vue-cli脚手架中配置一个vue-router前端路由
2017/07/03 Javascript
详解.vue文件解析的实现
2018/06/11 Javascript
js实现倒计时器自定义时间和暂停
2019/02/25 Javascript
在vue中使用cookie记住用户上次选择的实例(本次例子中为下拉框)
2020/09/11 Javascript
JS如何生成动态列表
2020/09/22 Javascript
python根据给定文件返回文件名和扩展名的方法
2015/03/27 Python
python matplotlib包图像配色方案分享
2020/03/14 Python
Django视图、传参和forms验证操作
2020/07/15 Python
Python faker生成器生成虚拟数据代码实例
2020/07/20 Python
Shoes For Crews法国官网:美国领先的防滑鞋设计和制造商
2018/01/01 全球购物
理肤泉美国官网:La Roche-Posay
2018/01/17 全球购物
销售会计工作职责
2013/12/02 职场文书
2014年社会实践活动总结范文
2014/04/29 职场文书
工作分析计划书
2014/04/30 职场文书
升旗仪式演讲稿
2014/05/08 职场文书
董事长助理工作职责范本
2014/07/01 职场文书
小学生差生评语
2014/12/29 职场文书
Nginx 502 Bad Gateway错误原因及解决方案
2021/03/31 Servers
python文件名批量重命名脚本实例代码
2021/04/22 Python
Redis源码阅读:Redis字符串SDS详解
2021/07/15 Redis
SpringBoot整合RabbitMQ的5种模式实战
2021/08/02 Java/Android