1、業務需求:用戶投保時保存全頁面截圖
2、截圖插件:html2canvas
使用npm或yarn(可以使用淘寶鏡像)
npm install html2canvas
yarn add html2canvas
在需要的頁面引入html2canvas
import html2canvas from 'html2canvas'
直接上代碼
<div ref="imageTofile">
<!-- 頁面內容 -->
</div>
<script>
import html2canvas from "html2canvas";
export default {
data() {
return {
...
}
},
methods: {
// 全屏截圖
imgDownload() {
let _that = this;
// 獲取需下載范圍元素
let img = this.$refs.imageTofile;
// 圖片高度
var w = parseInt(window.getComputedStyle(img).width);
// 圖片寬度
var h = parseInt(window.getComputedStyle(img).height);
// 聲明畫布寬高
let canvas = document.createElement("canvas");
canvas.width = w;
canvas.height = h;
canvas.style.width = w + "px";
canvas.style.height = h + "px";
// 利用 html2canvas 下載 canvas
html2canvas(img, {
canvas: canvas,
useCORS: true, // 如果頁面有跨域的圖片,需要加上這個
scrollY: 0
}).then(function(canvas) {
let photoUrl = canvas.toDataURL(); // base64圖片地址
let conversions = _that.base64ToBlob(photoUrl, "image/png");
window.URL = window.URL || window.webkitURL; // blob對象轉換為blob-url
let url = window.URL.createObjectURL(conversions);
console.log(url); // 圖片路徑 blob格式,主要是base64的圖片格式太長,防止瀏覽器的url長度限制。
});
},
base64ToBlob(urlData, type) {
let arr = urlData.split(",");
let mime = arr[0].match(/:(.*?);/)[1] || type;
// 去掉url的頭,並轉化為byte
let bytes = window.atob(arr[1]);
// 處理異常,將ascii碼小於0的轉換為大於0
let ab = new ArrayBuffer(bytes.length);
// 生成視圖(直接針對內存):8位無符號整數,長度1個字節
let ia = new Uint8Array(ab);
for (let i = 0; i < bytes.length; i++) {
ia[i] = bytes.charCodeAt(i);
}
return new Blob([ab], {
type: mime
});
}
}
}
</script>
乍看一下好像沒啥問題,實際操作你會發現以下幾個問題
1、白屏,只截到一部分

這個問題是頁面滾動的原因,導致截圖白屏,解決方案就是截圖之前跳到頂部
document.documentElement.scrollTop = 0;
document.body.scrollTop = 0;
2、頁面寬高比例導致的截圖只截了一部分

這種情況是寬高比例的原因導致,解決方法是調整寬高的比例
// 聲明畫布寬高 let canvas = document.createElement("canvas"); canvas.width = w * 4; // 乘了一個倍率 canvas.height = h * 3.; // 乘了一個倍率 canvas.style.width = w + "px"; canvas.style.height = h + "px"; // 可能跟html5canvas的canvas的初始大小有關,這個倍率跟實際頁面的寬高有關
我的頁面寬高是414*1946,具體是多少,需要去試。
如果大家有更好的方法,希望給我說一下
