使用vue實(shí)現(xiàn)HTML頁面生成圖片的方法
隨著網(wǎng)絡(luò)的發(fā)展,越來越多的網(wǎng)絡(luò)平臺應(yīng)運(yùn)而生。如何獲得更多的流量,吸引更多的眼球已經(jīng)成為網(wǎng)絡(luò)平臺生存、發(fā)展的必要條件。現(xiàn)在網(wǎng)絡(luò)平臺最常見的一種宣傳方式就是人邀人。
我最近就接到一個(gè)需求,做一個(gè) 海報(bào)頁面,并且能保存到手機(jī) ,方便用戶分享給朋友,希望能夠達(dá)到人邀人的效果。
給人第一感覺這個(gè)需求就是保存圖片的功能,當(dāng)時(shí)梳理是卻發(fā)現(xiàn)不是那么簡單:
1.動態(tài)生成一張帶logo的二維碼
2.整個(gè)海報(bào)的html部分轉(zhuǎn)化成圖片
3.保存圖片至手機(jī)相冊
生成帶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 }
問題來了:二維碼出現(xiàn)了,但是二維碼和logo大小并不是你想要,無法自適應(yīng)。那就需要我們重置二維碼和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轉(zhuǎn)化為base64圖片
html轉(zhuǎn)化為canvas中我選用組件 html2canvas
yarn add html2canvas
import html2canvas from 'html2canvas'
為了防止頁面有閃屏我用了兩個(gè)div,一個(gè)存放原來的dom,一個(gè)存放canvas的生成的圖片,再v-if控制展示的元素。
js調(diào)用函數(shù):
htmlToCanvas() { html2canvas(this.$refs.bill, {}) .then((canvas) => { let imageUrl = canvas.toDataURL('image/png'); // 將canvas轉(zhuǎn)成base64圖片格式 this.canvasImageUrl = imageUrl; this.isDom = false; }); } // 二維碼地址 this.qrcodeUrl = data.data.inviteCodeAddress // 調(diào)用html轉(zhuǎn)化canvas函數(shù) this.htmlToCanvas();
結(jié)果如圖:
頁面轉(zhuǎn)化成了圖片,但是二維碼沒有展示出來,控制臺報(bào)錯(cuò):
除二維碼其他部分已經(jīng)轉(zhuǎn)化為圖片,二維碼不顯示,原因有兩種可能:
轉(zhuǎn)化時(shí)二維碼還沒有加載完成
轉(zhuǎn)化二維碼的過程中報(bào)錯(cuò)了
首先嘗試了nextTick
使用 nextTick 將回調(diào)延遲到下次DOM更新循環(huán)之后執(zhí)行
// 二維碼地址 this.qrcodeUrl = data.data.inviteCodeAddress this.$nextTick(() => { // 跳用html轉(zhuǎn)化canvas函數(shù) this.htmlToCanvas(); })
發(fā)現(xiàn)二維碼出來了,但是二維碼的大小不對,并且控制臺還是存在報(bào)錯(cuò)。雖然問題沒有完全解決,但是二維碼出現(xiàn)了??梢宰C明二維碼不展示的原因是,轉(zhuǎn)化時(shí)二維碼沒有加載完成。
再嘗試使用setTimeout
使用 setTimeout 將回調(diào)延遲到指定時(shí)間之后執(zhí)行
// 二維碼地址 this.qrcodeUrl = data.data.inviteCodeAddress setTimeout(()=>{ // 調(diào)用html轉(zhuǎn)化canvas函數(shù) this.htmlToCanvas(); }, 200)
查看效果:
注:setTimeout是我目前能想到延遲加載方法。各位大佬們,如果這個(gè)有更好的方法解決上面的問題,麻煩給留言,在此謝過。
頁面正常,控制臺沒有報(bào)錯(cuò),可是logo沒有展示出來。
logo地址是:
iconurl: 'https://static.daojia.com/assets/project/tosimple-pic/LOGO_1576564983633.png',
項(xiàng)目在本地啟動,可能存在跨域問題。
htmlToCanvas() { html2canvas(this.$refs.bill, { useCORS: true // 解決圖片跨域問題 }).then((canvas) => { // 將canvas轉(zhuǎn)成base64圖片格式 let imageUrl = canvas.toDataURL('image/png'); this.canvasImageUrl = imageUrl; this.isDom = false; }).catch((e) => console.log(e)); }
至此html成功轉(zhuǎn)化為圖片。
圖片保存至手機(jī)
首先嘗試了JS-SDK中的下載圖片downloadImage
經(jīng)過各種嘗試并不能實(shí)現(xiàn)。
最后采用的是微信長按保存圖片
海報(bào)部分已經(jīng)轉(zhuǎn)化為圖片,無需再開發(fā),只要提示用戶長按圖片可以保存即可。
總結(jié)
到此這篇關(guān)于使用vue實(shí)現(xiàn)HTML頁面生成圖片的文章就介紹到這了,更多相關(guān)vue html頁面生成圖片內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Vue實(shí)現(xiàn)移除數(shù)組中特定元素的方法小結(jié)
這篇文章主要介紹了Vue如何優(yōu)雅地移除數(shù)組中的特定元素,文中介紹了單個(gè)去除和批量去除的操作方法,并通過代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-03-03腳手架(vue-cli)創(chuàng)建Vue項(xiàng)目的超詳細(xì)過程記錄
用vue-cli腳手架可以快速的構(gòu)建出一個(gè)前端vue框架的項(xiàng)目結(jié)構(gòu),下面這篇文章主要給大家介紹了關(guān)于腳手架(vue-cli)創(chuàng)建Vue項(xiàng)目的超詳細(xì)過程,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-05-05Vue 兩個(gè)字段聯(lián)合校驗(yàn)之修改密碼功能的實(shí)現(xiàn)
本文以校驗(yàn)兩次密碼的一致性應(yīng)用,給出兩個(gè)可變屬性值的字段之間的聯(lián)合校驗(yàn)的典型解決方案,通過實(shí)例代碼給大家介紹Vue 兩個(gè)字段聯(lián)合校驗(yàn)之修改密碼功能的實(shí)現(xiàn),需要的朋友一起看看吧2021-07-07Vue+Echart柱狀圖實(shí)現(xiàn)疫情數(shù)據(jù)統(tǒng)計(jì)
這篇文章主要介紹了在Vue nuxt項(xiàng)目中,如何使用Echart(百度圖表)柱狀圖來實(shí)現(xiàn)疫情數(shù)據(jù)統(tǒng)計(jì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2021-12-12