前端html2canvas生成截圖實(shí)現(xiàn)步驟與踩坑記錄
需求:
點(diǎn)擊下載可以導(dǎo)出組件的截圖及數(shù)據(jù)信息文件
分析:
前端生成組件截圖,帶著其他參數(shù)傳給后端,拿到excel文件并下載。關(guān)鍵在于生成組件的截圖,這里通過html2canvas插件來實(shí)現(xiàn)。
實(shí)現(xiàn)步驟
1.下載插件
npm install html2canvas
2.引入
import html2canvas from 'html2canvas'
3.通過ref拿到要下載組件的dom元素
//下載圖標(biāo),綁定下載事件 <i class="el-icon-download" style="cursor: pointer;" @click="download"></i> //需要生成截圖的部分 <div class='wrapper' ref='screen'> ... </div>
4.通過html2canvas生成截圖
download() {
//el的全局loading,根據(jù)需求,可加可不加,在下載完成時(shí)或請求完成時(shí)用 loading.close()關(guān)閉
const loading = this.$loading({
lock: true,
text: '文件下載中',
spinner: 'el-icon-loading',
background: 'rgba(0, 0, 0, 0.8)'
});
html2canvas(this.$refs.screen, {
backgroundColor: null,//畫布背景色(如果未在DOM中指定)。設(shè)置null為透明
useCORS: true, //允許跨域
scale: 1 //用于渲染的比例
}).then((canvas) => {
// 此時(shí)已經(jīng)生成我們想要的截圖,可以下載查看
const url = canvas.toDataURL('image/png') //轉(zhuǎn)圖片鏈接,為圖片的base64形式
const a = document.createElement('a')
const event = new MouseEvent('click')
a.download = '圖片'
a.href = url
a.dispatchEvent(event)
loading.close()
// 轉(zhuǎn)為png格式文件格式傳以給后端
// formData即為我們要傳的內(nèi)容,如果還有其他參數(shù)要傳輸可以通過formData.append('key',value)來添加
const formData = new FormData()
canvas.toBlob(function(blob) {
formData.append('image', blob, 'image.png')
})
})
},
可能遇到的問題
1.圖片跨域
因?yàn)轫?xiàng)目的圖片資源是托管在另一個(gè)平臺上,在生成截圖時(shí),原有dom的圖片由于跨域 canvas “被污染”,一直無法生成,嘗試了多種辦法,設(shè)置useCORS: true且給img標(biāo)簽設(shè)crossorigin="anonymous"也無法解決。最后找到兩種解決方案:一種是把圖片轉(zhuǎn)為編碼格式base64,此方法可以純前端解決該問題,另一種是修改服務(wù)端的配置來解決跨域問題。采用的是第一種方案,附上轉(zhuǎn)base64的方法。(但這種方法也會有代碼冗余體積增大,可讀性降低等缺點(diǎn))
imgUrlToBase64(imgUrl) {
const image = new Image();
image.setAttribute('crossOrigin', 'anonymous');
const imageUrl = imgUrl;
image.src = imageUrl
// image.onload為異步加載
image.onload = () => {
var canvas = document.createElement('canvas');
canvas.width = image.width;
canvas.height = image.height;
var context = canvas.getContext('2d');
context.drawImage(image, 0, 0, image.width, image.height);
var quality = 0.8;
const dataurl = canvas.toDataURL('image/png', quality);
console.log(dataurl, 'dataurl64')
}
},
2.css樣式丟失
html2canvas的屏幕截圖是基于 DOM 的,不會生成實(shí)際的屏幕截圖,而是基于頁面上可用的信息構(gòu)建屏幕截圖,html2canvas庫對以下樣式可能無效或不完全支持:
- CSS動(dòng)畫和過渡效果:html2canvas庫在截圖時(shí)不會觸發(fā)CSS動(dòng)畫和過渡效果,只會捕捉到元素的初始狀態(tài)。
- CSS偽元素(如::before和::after):html2canvas庫無法捕捉到CSS偽元素的樣式。
- CSS濾鏡效果:html2canvas庫無法捕捉到CSS濾鏡效果(如blur、grayscale等)。
- CSS變量(CustomProperties):html2canvas庫無法解析和應(yīng)用CSS變量。
- SVG圖像:html2canvas庫對SVG圖像的支持有限,可能無法正確渲染和捕捉SVG圖像。
生成截圖的其他方案domtoimage
由于html2canvas這個(gè)插件在生成截圖的時(shí)候有很多弊端,在canvas繪制時(shí)耗時(shí)長,且繪制時(shí)屏幕會阻塞無法操作,后續(xù)截圖選擇了其他方案,使用domtoimage發(fā)現(xiàn)絲滑很多,可參考文章使用domtoimage生成截圖。
總結(jié)
到此這篇關(guān)于前端html2canvas生成截圖實(shí)現(xiàn)步驟與踩坑記錄的文章就介紹到這了,更多相關(guān)前端html2canvas生成截圖內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Javascript中的return作用及javascript return關(guān)鍵字用法詳解
本文給大家介紹Javascript中的return作用及javascript return關(guān)鍵字用法詳解,對于大家學(xué)習(xí)javascript中的return知識有所幫助,感興趣的朋友一起學(xué)習(xí)吧2015-11-11
移動(dòng)端使用localStorage緩存Js和css文的方法(web開發(fā))
這篇文章主要介紹了web移動(dòng)端使用localStorage緩存Js和css文的方法,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-09-09
微信小程序數(shù)據(jù)分析之自定義分析的實(shí)現(xiàn)
這篇文章主要介紹了微信小程序數(shù)據(jù)分析之自定義分析的實(shí)現(xiàn),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-08-08
javascript實(shí)現(xiàn)html頁面之間參數(shù)傳遞的四種方法實(shí)例分析
這篇文章主要介紹了javascript實(shí)現(xiàn)html頁面之間參數(shù)傳遞的四種方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了JavaScript實(shí)現(xiàn)頁面之間參數(shù)傳遞的常用技巧,需要的朋友可以參考下2015-12-12
javascript實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘的啟動(dòng)和停止
這篇文章主要為大家詳細(xì)介紹了javascript實(shí)現(xiàn)動(dòng)態(tài)時(shí)鐘的啟動(dòng)和停止文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-10-10

