隨着網絡的發展,愈來愈多的網絡平臺應運而生。如何得到更多的流量,吸引更多的眼球已經成爲網絡平臺生存、發展的必要條件。如今網絡平臺最多見的一種宣傳方式就是人邀人。html
我最近就接到一個需求,作一個海報頁面,而且能保存到手機,方便用戶分享給朋友,但願可以達到人邀人的效果。前端
給人第一感受這個需求就是保存圖片的功能,當時梳理是卻發現不是那麼簡單:vue
用vue_qrcodes生成帶logo的二維碼npm
安裝canvas
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的樣式。bash
.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轉化爲canvas中我選用組件html2canvas微信
yarn add html2canvas
複製代碼
import html2canvas from 'html2canvas'
複製代碼
爲了防止頁面有閃屏我用了兩個div,一個存放原來的dom,一個存放canvas的生成的圖片,再v-if控制展現的元素。 網絡
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();
複製代碼
結果如圖:
dom
頁面轉化成了圖片,可是二維碼沒有展現出來,控制檯報錯:
除二維碼其餘部分已經轉化爲圖片,二維碼不顯示,緣由有兩種可能:
轉化時二維碼尚未加載完成
轉化二維碼的過程當中報錯了
首先嚐試了nextTick
使用 nextTick 將回調延遲到下次DOM更新循環以後執行
// 二維碼地址
this.qrcodeUrl = data.data.inviteCodeAddress
this.$nextTick(() => {
// 跳用html轉化canvas函數
this.htmlToCanvas();
})
複製代碼
發現二維碼出來了,可是二維碼的大小不對,而且控制檯仍是存在報錯。雖然問題沒有徹底解決,可是二維碼出現了。能夠證實二維碼不展現的緣由是,轉化時二維碼沒有加載完成。
再嘗試使用setTimeout
使用 setTimeout 將回調延遲到指定時間以後執行
// 二維碼地址
this.qrcodeUrl = data.data.inviteCodeAddress
setTimeout(()=>{
// 調用html轉化canvas函數
this.htmlToCanvas();
}, 200)
複製代碼
查看效果:
注: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
通過各類嘗試並不能實現。
最後採用的是微信長按保存圖片
海報部分已經轉化爲圖片,無需再開發,只要提示用戶長按圖片能夠保存便可。
注 :各位大佬們若是更好的方法保存圖片至手機相冊,歡迎留言
本文介紹海報保存至手機相冊的實現流程,部分環節上還存在優化空間,歡迎你們批評與指正,共同進步。