前端如何實現一鍵截圖功能?

2020-12-23 酷扯兒

本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫

前言

網頁截圖功能目前也是非常常見的需求, 尤其是在在線教育領域. 我們朋友圈的微信海報, 活動海報等, 一般都是運營/市場人員通過設計工具設計而成, 但是如何更好的映射到自己的服務體系裡面, 比如H5頁面中, 植入更多信息收集, 交互能力. 這一塊的應用探索, 頁面截圖是一個非常好的解決方案.

接下來筆者就來復盤一下如何基於網頁, 一鍵生成頁面海報的功能, 並將此能力, 集成到筆者的開源項目H5-Dooring中為編輯器賦能.

正文

在實現具體功能之前, 我們先看看具體的實現效果:

從演示中我們可以看出, 我們最終目標是實現在PC端生成H5頁面的截圖, 所以可能會涉及到以下幾個問題:

如何實現將頁面轉化為圖片如何實現H5效果模擬並截取實際的H5頁面我們可以先來想想實現思路, 如何能基於dom轉化為圖片? 這塊技術也是老生常談的課題了, 我們都知道可以用canvas來實現, 大致流程如下:

我們如果用原生的實現方案, 大致要經歷以上幾個步驟, 其中第二步是關鍵環節也是最複雜的一步, 我們需要手動實現dom到canvas的映射, 最後轉化為標準的canvas繪圖對象. 當然現成也有很多庫可以直接幫我們簡化這一步驟, 比如html2canvas, dom-to-image. 接下來我們就來解決第一個問題.

在親自調研了html2canvas庫並使用的過程中, 筆者發現了很多問題, 比如如果樣式中出現%單位, 或者有一些圖片背景的問題, 導致html2canvas並沒有很好的work, 而且渲染還原度和清晰度都有問題, 所以筆者暫時沒有深入研究(不過這些問題可以通過修改庫本身解決), 後面筆者直接用了dom-to-image, 發現使用起來很簡單, 而且幾乎不會出現上面說的這些問題, 所以筆者果斷採用了dom-to-image, 後面看了該庫的源碼, 感覺寫的也很優雅易懂, 後期做二次開發應該問題不是很大. 我們可以看看其官網的基本使用:

// 引入import domtoimage from 'dom-to-image';// 生成圖片domtoimage.toPng(node).then(function (dataUrl) { var img = new Image(); img.src = dataUrl; document.body.appendChild(img); }) .catch(function (error) { console.error('oops, something went wrong!', error); });

用法也很簡單,而且它提供了足夠多的配置項,我們可以靈活配置.

第一個問題就這麼解決了, 不過在使用過程中發現圖片模糊的問題, 這塊網上也有很多解決方案. 比如先放大dom, 在處理成canvas最後生成圖片的時候在縮小等, 這塊筆者就不一一舉例了.

因為我們設計的H5頁面都在pc端完成的, 所以要想生成H5預覽圖, 無非是本地模擬尺寸, 進行渲染, 具體方案如下:

採用iframe作為H5頁面容器去生成截圖直接限制寬度在當前頁面生成截圖採用服務端爬蟲一鍵模擬手機訪問生成截圖上面說的方案都可以嘗試,第三種方案筆者之前也開源過爬蟲應用來解決這個問題,感興趣的可以研究了解一下,我們很明顯會選擇第一種方案來實現,就如演示中的,我們看到的彈窗中的H5其實是在iframe中渲染的:

實現思路有了,該問題也就很好實現了,我們只需要在父頁面和iframe實現消息通信即可,比如在iframe加載完成之後手動通知iframe截取自身.基本實現代碼如下:

// 編輯器頁面, 也就是父頁面// 定義截圖子頁面句柄函數window.getFaceUrl = (url) => {setFaceUrl(url) setShowModalIframe(false)}// iframe頁面, 也就是預覽頁面const generateImg = (cb:any) => { domtoimage.toBlob(refImgDom.current, { width, height, } ) .then(function (blob:Blob) { const formData = new FormData(); formData.append('file', blob, 'tpl.jpg'); req.post('/files/upload/free', formData).then((res:any) => { cb && cb(res.url) }) }) .catch(function (error:any) { console.error('oops, something went wrong!', error); });}// 觸發父頁面的方法,將圖片傳給父頁面generateImg((url:string) => { parent.window.getFaceUrl(url);})

最後

以上教程筆者已經集成到H5-Dooring中,對於一些更複雜的交互功能,通過合理的設計也是可以實現的,大家可以自行探索研究。

相關焦點

  • 阿里雲Cloud Toolkit VSCode新版本發布:實現一鍵打包部署,開發...
    首頁 > 見聞 > 關鍵詞 > 阿里雲最新資訊 > 正文 阿里雲Cloud Toolkit VSCode新版本發布:實現一鍵打包部署,開發提速 8 倍
  • 蘋果手機自帶截圖方法,一鍵就能截長圖片,你用過嗎
    蘋果手機自帶截圖方法,一鍵就能截長圖片,你用過嗎今天我們來分享一下蘋果手機自帶的長截圖功能,蘋果手機截圖方式有很多,但是長截圖一直沒有,需要配合第三方才能使用,今天我們就來說說蘋果手機長截屏的正確打開方式。
  • 大學生電腦必裝,一鍵截圖翻譯神器軟體,論文閱讀好幫手!
    一鍵截圖翻譯工具這是一款看外文論文,敲代碼檢錯必備的工具我們平時不論是寫論文需要英文參考專業文獻,還是用電腦碰到一大堆崩潰代碼,程序debug的時候出現錯誤,整篇的英文密密麻麻那就是截圖翻譯工具,一鍵翻譯神器。你只要進行截圖或者複製內容操作,它就立刻捕捉剪貼板,自動識別成文字並翻譯。內部配置谷歌翻譯,百度翻譯等翻譯器。
  • 玩轉小米10系列一鍵換機 輕鬆實現新舊機數據搬家
    對於已經買到小米10系列的同學,大家知道如何輕鬆實現新舊手機之間的數據轉移嗎?小米10系列一鍵換機功能將會成為你的最佳選擇,用一杯咖啡的功夫,讓新裝備輕鬆變身「老搭檔」。小愛同學微博截圖最新版的小米換機提供乾淨清爽的界面,只需四步即可幫你完成換機;不論是旅行照片、親友聊天記錄還是桌面的布局和個性的設置等,小米換機全都能換;小米換機採用了全新的數據傳輸方式,大文件傳輸速度明顯提升,1G的數據,最快十幾秒即可完成。
  • 如何實現後臺管理系統的權限路由和權限菜單
    本文轉載自【微信公眾號:趣談前端,ID:beautifulFront】經微信公眾號授權轉載,如需轉載與原文作者聯繫前言本文是繼 前端如何一鍵生成多維度數據可視化分析報表 實戰的最後一篇文章, 主要介紹如何實現後臺管理系統的權限路由和權限菜單.
  • 智能電視怎麼截圖?當貝市場分享三種方法實現一鍵截屏
    那麼,你可能需要直接電視截圖,接下來,小編就來分享電視截圖的教程了!  方法一:悟空遙控器  首先要在智能電視和手機上分別下載一個悟空遙控,在悟空遙控器的工具箱中就有截屏這個功能。進入瀏覽器上傳,在電腦瀏覽器中輸入提示網址,即可上傳文件,快速截圖。此方法也要保證電腦與電視在同一區域網中。
  • PDF編輯器隱藏功能,比截圖還方便!
    如果想要快速在PDF文檔中截取內容,應該如何實現呢?截圖是我們工作中經常使用的,現在很多軟體都會有一個截圖工具;那麼我們平時用於編輯PDF文檔的編輯器中有截圖工具嗎?PDF編輯器中有截圖工具嗎?其實是有的,但是在PDF編輯器中不叫截圖工具,那個叫快照;如要我們需要截取PDF文檔中一部分內容,那麼利用快照功能就可以實現,複製好後,可以粘貼在word,ppt等編輯文本中。怎樣在PDF文件中使用快照功能?如何操作呢?下面一起來看看吧!
  • 店寶寶正式上線「一鍵開店」功能
    店寶寶正式上線「一鍵開店」功能 近日,知名輔助開店平臺店寶寶正式上線「一鍵開店」功能,據已經體驗過的賣家透露,個人只需準備好身份證和淘寶帳號,就能在三分鐘內開啟一家淘寶店鋪。
  • 英特爾GCC公測版更新:增強一鍵優化、截圖和直播等
    GDC 2019大會上,英特爾Graphics Command Center (GCC)首次亮相,帶來了更加人性化、時尚和現代化的圖形控制面板,並提供了諸如一鍵優化熱門遊戲、各種圖形設置說明等實用功能。 今天英特爾帶來了 GCC 更新 ,目前已經處於公測狀態。
  • 百度發布滾動截圖APP:支持一鍵生成長截圖
    百度發布滾動截圖APP:支持一鍵生成長截圖2020-12-01 09:58出處/作者:快科技整合編輯:佚名責任編輯:lishiye1>   在截取聊天記錄、網站全文時,長截圖效率非常高,但目前iOS系統只有Safari瀏覽器支持長截圖,其他系統界面、APP界面卻無法長截圖。
  • 百度網盤推出「一鍵搬家」功能 可一鍵搬運網易相冊照片
    百度網盤推出「一鍵搬家」功能 可一鍵搬運網易相冊照片 站長之家(ChinaZ.com) 3月21日 消息:近日,百度網盤官方微博宣布,推出全新功能——網易相冊一鍵搬家
  • QQ PC端迎內測更新:一鍵消息錄製+自定義截圖
    同時,截圖中新增了一鍵高清錄製功能,可以用視頻形式記錄歷史消息,保證重要信息的完整傳達。用戶還可在截圖功能裡選擇自定義截圖工具,在截圖時長按右鍵,即可自由勾畫截圖區域。在上月中旬,PC端QQ還在9.2.5更新中增添了「群課堂」功能,方便網絡授課及家校互動。關於QQ內測版更新詳情可進入官網查看。
  • 一鍵鎖屏捷徑怎麼製作 iOS12一鍵鎖屏捷徑製作教程
    前幾天小編為大家分享了有關一鍵重啟捷徑製作教程,獲得了不少網友的關注。教程發布之後就有部分網友在「IT數碼通」公眾號給我們留言,表示能不能幫忙製作一個一鍵鎖屏的捷徑。剛開始小編覺得挺難的,後來經過了幾天的研究才發現一鍵鎖屏捷徑非常簡單。那麼一鍵鎖屏捷徑怎麼製作呢?接下來看看IT數碼通小編為大家帶來的iOS12一鍵鎖屏捷徑製作教程。
  • iphone11截圖怎麼截 蘋果11截圖功能快捷鍵設置教程
    iphone11截圖怎麼截 蘋果11截圖功能快捷鍵設置教程  在iOS13系統中,很多功能都有改變,那麼iphone11截圖功能在哪裡呢?本期就以iOS13系統版本的iPhone11手機為例來為你解答,大家一起來看看吧!  方法一:快捷鍵截圖  只需要同時按下側邊【電源鍵】和【音量+鍵】即可實現快速截屏操作。
  • 百度發布超實用APP:錄屏一鍵生成長截圖
    截取聊天記錄和網站全文時,長屏幕截圖的效率很高,但目前只有Safari瀏覽器在iOS系統中支持長屏幕截圖,而其他系統接口和應用程式界面不能是長屏幕截圖。據官方稱,該應用程式有兩個主要功能:百度表示,該應用程式是一款專業的流媒體內容截圖應用,操作簡單高效,一鍵可以截取超長頁面。應用程式提供滾動截圖,用戶可以根據需要停止,擺脫瀏覽內容的限制,網站、應用程式可以被截取。此外,在記錄屏幕結束後,應用程式將自動生成和增長屏幕截圖,而無需二次操作,告別屏幕截圖+切割+拼接的冗餘過程。
  • 精通React/Vue系列之帶你實現一個功能強大的通知提醒框
    React',description: '學前端,學React/vue/Node,快快加入我們吧'});我們看到的組件效果可能是這樣的:那麼我們如何實現這樣的調用方式呢?並且我們都知道,antd或者element這種組件庫,會自帶一些主題狀態,來提高用戶的使用效率,比如會有success(成功狀態),warning(警告狀態),error(錯誤狀態),info(通知狀態)等,那麼我們自己實現的組件也因該具備這些功能。
  • 索尼微單這個功能 讓你一鍵實現「照片管理」
    然而在Sony的相機上,有一個方便的功能,可以讓我們實現快速便攜的照片管理,那就是「照片分級」功能。「照片分級」的功能使用起來非常便攜,在相機的「回放自定義鍵」設置中,將某一快捷鍵(這裡我們使用C1鍵)設置為「分級」功能,同時可以選擇照片分級的星級,一般我們會把1-5全部勾選,可以實現更多的分級設置。
  • 一鍵生成電影臺詞長截圖,不能更快了 | 挖 App
    因為鏡頭幾乎不變,只是臺詞較多,所以在進行長截圖時會只保留下面的字幕。不少同學問這種長截圖怎麼做,這還不簡單?用 Photoshop 把每句字幕裁剪下來,然後拼到一起...來介紹一下今天的這個神器——PPIICC,這是一個專門用來拼接長圖的軟體,甭管是橫的豎的,還是長的短的,都能拼成一張完美的長截圖。愛拼才會贏!下載地址見文末電影臺詞首先準備好截圖,選擇要拼接的圖片。然後在拼接設置中選擇「電影臺詞拼接」。最後點擊拼接。
  • iOS 14截圖大招!手指在iPhone 背面敲三下就能實現
    蘋果在WWDC上展示不少iOS 14新功能,不過還有些實用的隱藏功能卻是沒有在發表會上提到,就像是iOS 14「背面輕點」功能,可讓iPhone透過背面敲點三下就能實現截圖,就不需要再透過實體快捷鍵或小白點來截圖了!
  • 如何操作客所思4.0控制面板的無損錄音功能(上)
    02/ 演唱小樣錄音、商場定時/循環播放背景音樂、基調查詢、播放器除了長時間錄音功能,小編還注意到短時間錄音功能、定時操作、基調查詢功能也各具特點。短時間錄音功能,能夠實現實時錄音、剪輯、保存功能。很適合在正式演唱前,打開短時間錄音,先錄製一遍小樣,回聽以判斷聲音的狀態、演唱的發揮水平等等。