偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

前端如何實(shí)現(xiàn)一鍵截圖功能?

開發(fā) 前端
網(wǎng)頁(yè)截圖功能目前也是非常常見的需求, 尤其是在在線教育領(lǐng)域. 我們朋友圈的微信海報(bào), 活動(dòng)海報(bào)等, 一般都是運(yùn)營(yíng)/市場(chǎng)人員通過設(shè)計(jì)工具設(shè)計(jì)而成, 但是如何更好的映射到自己的服務(wù)體系里面, 比如H5頁(yè)面中, 植入更多信息收集, 交互能力. 這一塊的應(yīng)用探索, 頁(yè)面截圖是一個(gè)非常好的解決方案.

[[353862]]

 前言

網(wǎng)頁(yè)截圖功能目前也是非常常見的需求, 尤其是在在線教育領(lǐng)域. 我們朋友圈的微信海報(bào), 活動(dòng)海報(bào)等, 一般都是運(yùn)營(yíng)/市場(chǎng)人員通過設(shè)計(jì)工具設(shè)計(jì)而成, 但是如何更好的映射到自己的服務(wù)體系里面, 比如H5頁(yè)面中, 植入更多信息收集, 交互能力. 這一塊的應(yīng)用探索, 頁(yè)面截圖是一個(gè)非常好的解決方案.

接下來筆者就來復(fù)盤一下如何基于網(wǎng)頁(yè), 一鍵生成頁(yè)面海報(bào)的功能, 并將此能力, 集成到筆者的開源項(xiàng)目H5-Dooring中為編輯器賦能.

正文

在實(shí)現(xiàn)具體功能之前, 我們先看看具體的實(shí)現(xiàn)效果:


從演示中我們可以看出, 我們最終目標(biāo)是實(shí)現(xiàn)在PC端生成H5頁(yè)面的截圖, 所以可能會(huì)涉及到以下幾個(gè)問題:

  • 如何實(shí)現(xiàn)將頁(yè)面轉(zhuǎn)化為圖片
  • 如何實(shí)現(xiàn)H5效果模擬并截取實(shí)際的H5頁(yè)面

我們可以先來想想實(shí)現(xiàn)思路, 如何能基于dom轉(zhuǎn)化為圖片? 這塊技術(shù)也是老生常談的課題了, 我們都知道可以用canvas來實(shí)現(xiàn), 大致流程如下: 


我們?nèi)绻迷膶?shí)現(xiàn)方案, 大致要經(jīng)歷以上幾個(gè)步驟, 其中第二步是關(guān)鍵環(huán)節(jié)也是最復(fù)雜的一步, 我們需要手動(dòng)實(shí)現(xiàn)dom到canvas的映射, 最后轉(zhuǎn)化為標(biāo)準(zhǔn)的canvas繪圖對(duì)象. 當(dāng)然現(xiàn)成也有很多庫(kù)可以直接幫我們簡(jiǎn)化這一步驟, 比如html2canvas, dom-to-image. 接下來我們就來解決第一個(gè)問題.

如何實(shí)現(xiàn)將頁(yè)面轉(zhuǎn)化為圖片

在親自調(diào)研了html2canvas庫(kù)并使用的過程中, 筆者發(fā)現(xiàn)了很多問題, 比如如果樣式中出現(xiàn)%單位, 或者有一些圖片背景的問題, 導(dǎo)致html2canvas并沒有很好的work, 而且渲染還原度和清晰度都有問題, 所以筆者暫時(shí)沒有深入研究(不過這些問題可以通過修改庫(kù)本身解決), 后面筆者直接用了dom-to-image, 發(fā)現(xiàn)使用起來很簡(jiǎn)單, 而且?guī)缀醪粫?huì)出現(xiàn)上面說的這些問題, 所以筆者果斷采用了dom-to-image, 后面看了該庫(kù)的源碼, 感覺寫的也很優(yōu)雅易懂, 后期做二次開發(fā)應(yīng)該問題不是很大. 我們可以看看其官網(wǎng)的基本使用:

  1. // 引入 
  2. import domtoimage from 'dom-to-image'
  3.  
  4. // 生成圖片 
  5. domtoimage.toPng(node) 
  6.     .then(function (dataUrl) { 
  7.         var img = new Image(); 
  8.         img.src = dataUrl; 
  9.         document.body.appendChild(img); 
  10.     }) 
  11.     .catch(function (error) { 
  12.         console.error('oops, something went wrong!', error); 
  13.     }); 

用法也很簡(jiǎn)單, 而且它提供了足夠多的配置項(xiàng), 我們可以靈活配置.


第一個(gè)問題就這么解決了, 不過在使用過程中發(fā)現(xiàn)圖片模糊的問題, 這塊網(wǎng)上也有很多解決方案. 比如先放大dom, 在處理成canvas最后生成圖片的時(shí)候在縮小等, 這塊筆者就不一一舉例了.

如何實(shí)現(xiàn)H5效果模擬并截取實(shí)際的H5頁(yè)面

因?yàn)槲覀冊(cè)O(shè)計(jì)的H5頁(yè)面都在pc端完成的, 所以要想生成H5預(yù)覽圖, 無非是本地模擬尺寸, 進(jìn)行渲染, 具體方案如下:

  • 采用iframe作為H5頁(yè)面容器去生成截圖
  • 直接限制寬度在當(dāng)前頁(yè)面生成截圖
  • 采用服務(wù)端爬蟲一鍵模擬手機(jī)訪問生成截圖

上面說的方案都可以嘗試, 第三種方案筆者之前也開源過爬蟲應(yīng)用來解決這個(gè)問題, 感興趣的可以研究了解一下, 我們很明顯會(huì)選擇第一種方案來實(shí)現(xiàn), 就如演示中的, 我們看到的彈窗中的H5其實(shí)是在iframe中渲染的:

實(shí)現(xiàn)思路有了, 該問題也就很好實(shí)現(xiàn)了, 我們只需要在父頁(yè)面和iframe實(shí)現(xiàn)消息通信即可, 比如在iframe加載完成之后手動(dòng)通知iframe截取自身. 基本實(shí)現(xiàn)代碼如下:

  1. // 編輯器頁(yè)面, 也就是父頁(yè)面 
  2. // 定義截圖子頁(yè)面句柄函數(shù) 
  3. window.getFaceUrl = (url) => { 
  4.   setFaceUrl(url) 
  5.   setShowModalIframe(false
  6.  
  7. // iframe頁(yè)面, 也就是預(yù)覽頁(yè)面 
  8. const generateImg = (cb:any) => { 
  9.     domtoimage.toBlob(refImgDom.current,  
  10.       { 
  11.         width, 
  12.         height, 
  13.       } 
  14.     ) 
  15.     .then(function (blob:Blob) { 
  16.         const formData = new FormData(); 
  17.         formData.append('file', blob, 'tpl.jpg'); 
  18.         req.post('/files/upload/free', formData).then((res:any) => { 
  19.           cb && cb(res.url) 
  20.         }) 
  21.     }) 
  22.     .catch(function (error:any) { 
  23.         console.error('oops, something went wrong!', error); 
  24.     }); 
  25.  
  26. // 觸發(fā)父頁(yè)面的方法,將圖片傳給父頁(yè)面 
  27. generateImg((url:string) => { 
  28.   parent.window.getFaceUrl(url); 
  29. }) 

 

責(zé)任編輯:姜華 來源: 趣談前端
相關(guān)推薦

2023-12-22 13:57:00

文本復(fù)制長(zhǎng)按復(fù)制功能JS

2011-09-15 19:05:49

windows 7一鍵關(guān)機(jī)

2022-04-07 13:56:13

前端一鍵換膚

2021-02-22 11:07:49

Windows 10微軟數(shù)據(jù)傳輸

2015-02-09 15:25:52

換膚

2012-03-01 14:00:08

2023-11-02 10:14:50

TinykeysWeb應(yīng)用

2018-03-20 12:30:44

iOSPush抓包

2023-05-05 17:11:11

前端Mousetrap方式

2022-11-23 10:22:12

組件庫(kù)前端

2021-08-03 15:25:09

數(shù)據(jù)庫(kù)Sharding SpSQL

2022-11-24 16:11:27

2011-07-03 16:05:50

2021-10-14 08:40:58

前端技術(shù)數(shù)據(jù)可視化

2018-08-29 08:19:43

iPhone求救手機(jī)

2022-07-22 14:32:29

賬號(hào)登錄服務(wù)鴻蒙

2022-12-01 17:46:53

網(wǎng)頁(yè)變灰功能前端

2009-07-07 08:44:52

微軟Windows 7新功能

2021-10-19 05:49:15

Windows 11操作系統(tǒng)微軟

2015-11-03 15:29:49

ONOS開放網(wǎng)絡(luò)操作系統(tǒng)SDN
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)