html2canvas 可以實如今前端直接對頁面進行截屏。其實現思路是html2canvas腳本將頁面元素渲染爲canvas,經過讀取DOM並將不一樣的樣式應用到這些元素上實現。它不須要服務端的操做,只在前端便可完成。html
npm install --save html2canvas
複製代碼
// 在須要使用的頁面中先引入html2canvas
import html2canvas from 'html2canvas'
複製代碼
而後在頁面中使用,以下:前端
在template模板中,設置要生成圖片的內容,本文中要生成圖片的是ref="capture"的div,而後將生成的canvas圖片展現在ref="addImage"的div中web
<template>
<div class="content" ref="addImage">
<div ref="capture" class="image-content">
<p>html2canvas 可以實如今前端直接對頁面進行截屏。</p>
<p>其實現思路是html2canvas腳本將頁面元素渲染爲canvas,經過讀取DOM並將不一樣的樣式應用到這些元素上實現。</p>
<p>它不須要服務端的操做,只在前端便可完成。</p>
</div>
<div @click="generatorImage" class="img-btn">生成圖片</div>
</div>
</template>
複製代碼
而後在js文件中,generatorImage方法實現html到圖片的轉換,此時便可看到頁面尾部已經添加了生成的圖片內容,也能夠對圖片轉爲base64編碼並下載到本地。npm
generatorImage () {
html2canvas(this.$refs.capture).then(canvas => {
this.$refs.addImage.append(canvas);
let link = document.createElement('a');
link.href = canvas.toDataURL();
link.setAttribute('download', '圖片canvas.png');
link.style.display = 'none';
document.body.appendChild(link);
link.click();
})
}
複製代碼
若是要生成圖片的dom元素中,包含有跨域資源,好比img標籤中的跨域圖片,經過上述方法生成的圖片中,img的內容是空白的,沒法生成,這是由於canvas對於圖片資源的同源限制。canvas
解決方法: html2canvas能夠設置配置項,來實現圖片的加載跨域
allowTaint爲true是容許canvas被污染,一旦畫布污染,就沒法讀取其數據,不能使用畫布的toBolb(),toDataURL()或getImageData()方法,不然會出錯.服務器
若是咱們只是展現在頁面上,不經過js轉爲文件下載到本地(下載須要調用canvas.toDataURL()方法),則可使用該方法。(頁面中右鍵能夠將這張圖片無缺的保存到本地)app
解決跨域最經常使用的方法是跨域資源共享,咱們將圖片服務器的response header設置dom
access-control-allow-origin: *,
複製代碼
便可解決跨域圖片的訪問,同時,配合html2canvas的配置項useCORS: true,便可實現canvas圖片的轉化和下載。 因爲咱們本身項目的文件服務器暫時沒有設置CORS,因此此處例子採用淘寶的圖片this
<template>
<div class="content" ref="addImage">
<div ref="capture" class="image-content">
<div class="parent">
<img src='https://user-gold-cdn.xitu.io/2018/12/18/167c06ce8cf413d1?w=476&h=260&f=webp&s=11552'>
</div>
<div class="parent">
<img src='https://user-gold-cdn.xitu.io/2018/12/18/167c06ce8d058da5?w=140&h=140&f=png&s=563'>
</div>
<div class="parent">
<img src='https://user-gold-cdn.xitu.io/2018/12/18/167c06ce8da5216c?w=160&h=280&f=webp&s=10926'>
</div>
</div>
<div @click="generatorImage" class="img-btn">生成圖片</div>
</div>
</template>
複製代碼
js文件中:
generatorImage () {
html2canvas(this.$refs.capture,{useCORS: true}).then(canvas => {
this.$refs.addImage.append(canvas);
// 經過a標籤下載到本地
let link = document.createElement('a');
link.href = canvas.toDataURL();
link.setAttribute('download', '圖片canvas.png');
link.style.display = 'none';
document.body.appendChild(link);
link.click();
})
}
複製代碼