大家好,我是雄雄。
前言
相信大家在许多的场景下,看到过这样的案例。
- 当我们在某购物
app
上看好一件商品,想分享给别人时,app
会给我们生成一张海报,我们将其保存在手机里面转发给其他人达到分享。 - 当我们逛CSDN的时候,想要将某篇有营养的文章分享给别人时,也会生成一张好看的海报,用户只需一扫码,既能跳转到相应页面浏览。
- 在某些个人博客,比如:穆雄雄的博客中,我们看到某篇正合胃口的文章,想要分享给别人怎么办?也会生成一张精美小海报,然后随便转发。
今天,我们就来看看,如何使用vue
实现精致海报的分享。
效果图
类似这样的吧,下面的是CSDN的,上面的是我自己做的,可能不如CSDN做的专业,但是我的那种,你的背景图片是可以自己换的,所以如果你的审美比较好,那么你可以自己设计一个背景图,或者多张进行随机切换,我这边就是提供一下实现思路。
右下角是这篇文章的二维码,一扫就自动跳转过来了。
实现思路
- 准备一张精美的背景图,比如我这样的。(也可以准备多张,实现随机切换,实现代码我明天放上来),我的放在了七牛云里面了,大家也可以直接放在本地。
- 将当前内容生成一个二维码,放在右下角的位置,技术:
qrcodejs2
- 将
html
转换成canvas
,技术:html2canvas
- 按照自己想要的格式调整下样式即可。
其实思路,我看网上大家都是这么说的,我确实也是这么做的,但是按照网上的代码,确实也没有实现出来,所以自己写了个。
代码实现
- 安装
qrcodejs2
以来
npm i qrcodejs2
2. 安装html2canvas
依赖
npm i html2canvas
3. 在需要生成海报的页面,分别导入这两个依赖。
/*引入二维码*/ import QRCode from "qrcodejs2"; //html转换成canvas import html2canvas from "html2canvas";
- 在页面上写个
div
,用来存放海报的,我这是放在了el-dialog
里面了,各人有各人的需求。
<!--分享海报的弹出层--> <el-dialog width="20%" height="200px" center :visible.sync="dialogFengXiang" > <!-- 海报html元素 --> <div id="posterHtml" v-show="isShowBg"> <div class="fx_content "> <span style="color: #000000;font-size: 16px">{{ posterTitle }}</span> <p style="font-size: 12px;"> 关注微信订阅(公众)号【雄雄的小课堂】; <br /> 博客网址:https://www.穆雄雄.com </p> </div> <!-- 二维码 --> <div id="qrcodeImg" ref="qrcodeImg"></div> </div> </el-dialog>
- 大致设置一下样式吧,在
style
里面写:
/*分享的内容*/ .fx_content { width: 70%; float: left; margin: 109% 0 0 2%; } /*整个海报*/ #posterHtml { background-image: url(https://blogobs.88688.team/blog/fx-bg1.png); background-repeat: no-repeat; width: 100%; height: 450px; background-size: 100% 450px; margin: 0; padding: 0; } /*二维码*/ #qrcodeImg { width: 25%; height: 150px; float: right; margin-top: 108%; }
- 在
data
中声明变量:
data: function() { return { // 文案标题 posterTitle: "", // 文案内容 posterContent: "", // 最终生成的海报图片 posterImg: "", isShowBg: false, //是否显示对话框 dialogFengXiang: false }; },
- 在
methods
中实现两个功能,生成二维码和生成海报:
//分享的功能 fenxiang() { this.createPoster(); this.createQrcode(); this.dialogFengXiang = true; }, // 生成二维码 createQrcode() { this.$refs.qrcodeImg = ""; setTimeout(() => { // 生成二维码 new QRCode(this.$refs.qrcodeImg, { text: this.articleHref, width: 75, height: 75, colorDark: "#000000", colorLight: "#ffffff", correctLevel: QRCode.CorrectLevel.H }); }, 200); // qrcode.makeCode(text); }, //生成海报 createPoster() { // 生成海报 const vm = this; //重新弄一下标题 //let content = this.article.content.substring(0,110); /*let content = ""; this.posterContent = content+"....";*/ this.posterTitle = this.article.title.substring(0, 12) + "...."; const domObj = document.getElementById("posterHtml"); //显示海报 this.isShowBg = true; html2canvas(domObj, { useCORS: true, allowTaint: false, logging: false, letterRendering: true, onclone(doc) { let e = doc.querySelector("#posterHtml"); e.style.display = "block"; } }).then(function(canvas) { // 在微信里,可长按保存或转发 vm.posterImg = canvas.toDataURL("image/png"); }); },
当然,这里面的部分代码也是从网上看的别人的,拼拼凑凑出来的,我在他们的基础上改了改。
然后我们就实现生成海报的功能啦。