html2canvas - 微信中長按存圖 - 將h5活動結果保存到本地


 現在有很多在微信里流行的h5活動頁。這些小h5大部分都是簡單的交互然后得出一個abcd早就擬定好的結果,根據你的選項分幾種情況,最終得到其中一個作為你測試的答案。比如這個就是最后那張結果圖:

 

當時自己做的時候,網上搜不到一個系統完整的做法講解。這里整理一下。

### 實現微信h5保存網頁為圖片

雖然基本上活動都是有事先固定好的答案,但是每個用戶生成的結果還是不一樣的。尤其有的需求還有用戶的昵稱之類。
所以,就要動態生成web網頁為圖片了,然后用戶長按這張圖片,調取微信的長按存圖功能就行了。

 

這里只記錄 最后生成截圖並保存的做法
一般做法是,用戶選擇完畢生成結果后,要有一個事件比如click提前觸發,讓html2canvas趕緊畫圖:
具體html2canvas的使用和配置,以及bug填坑之類請看這一篇:[ JS - 基於html2canvas實現 網頁截圖(+下載截圖) 功能](https://www.cnblogs.com/padding1015/p/8947062.html)
這里我直接調用基於html2canvas封裝好的html2img方法:

1. html2canvas生成截圖

```js
html2img({
  targetEleId: oCanvas,
  imgType: 'png',
  titleStr: '描述語'
},false)
```
然后獲取截圖的base64碼,作為圖片的src,將新創造的img元素放進body中,
```js
.then((imgUrl)=>{
  let oImg = document.createElement('img');
  oImg.id = 'oImg';
  oImg.className = 'o-img';
  oImg.src= imgUrl;//imgUrl是html2canvas返回的截圖的base64碼
  document.body.appendChild(oImg);//將生成的截圖放到頁面中
});
```

2. 長按截圖(核心)- 調取微信的保存圖片到手機功能。

普通需求下,
既然微信是按誰存誰,按哪張圖存哪張圖,那把需要存的圖蓋到最上邊,讓其成為用戶可以按到的唯一一張圖,不就可以了?
所以 將這張要保存的圖片的層級調到最高,蓋到所有元素的上邊,就可以實現用戶長按圖片彈出保存功能



但有時候會遇到 某些需求 - 事實上市面上很多h5也實現了這個效果:)
要求最后保存到手機的圖和用戶當前看的最后一張結果圖不是一個!!!

 

一開始我都想哭。

 

我怎么長按這個圖存另一張啊,微信的長按存圖又沒接口給我改圖片的url。

 

后來想,讓蓋在上邊的圖不可視不就好了? 一張看不見的圖蓋在結果上邊,雖然用戶看到的是結果圖,但是存下來的就是另一張當時隱身的截圖。
狸貓換太子!

 

問題又來了:微信能否長按一張看不見、但是存在於dom結構中的圖,也調起存圖功能呢?
經過提心吊膽地測試后得出結論: 長按不可視的圖片也可以調起微信的長按存圖功能。哈哈!

 

所以最后的處理是:最后要保存的圖蓋在最上邊, 要讓其看不見,就設置透明度 opacity即可。
```css
.o-img{
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  opacity: 0;
  z-index: 20;
}
```
 
 2018-08-14  16:32:00


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM