亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

JS如何實現頁面截屏功能實例代碼

 更新時間:2021年06月15日 10:51:48   作者:一個per  
這篇文章主要給大家介紹了關于JS如何實現頁面截屏功能的相關資料,文中主要利用了html2canvas和canvas繪制兩個方法來實現,需要的朋友可以參考下

"頁面截屏"是前端經常遇到的需求,比如頁面生成海報,彈窗圖片分享等,因為瀏覽器沒有原生的截圖API,所以需要借助canvas來實現導出圖片實現需求。

可行性方案

  1. 方案1: 將 DOM 改寫成 canvas ,調用canvas的toBlob或者toDataURL方法即刻上傳到七牛云或服務器
  2. 方案2: 使用第三方庫html2canvas.js實現 canvas , 在不更改頁面已有DOM的情況下優(yōu)雅生產canvas

解決方案的選擇

方案1:需要手動計算每個DOM元素的Computed Style,然后需要計算好元素在canvas的大小位置等屬性。

方案1難點

  • 需要棄用已有的html頁面,改用canvas重寫。
  • 頁面結構層復雜的情況下用canvas寫,不易重構。
  • 有一定canvas基礎。

方案2:該項目在Github上stars已有兩萬多start,作者仍在積極維護。API非常簡單,在已有項目中開箱即用。

html2canvas

因為是常見的需求,所以社區(qū)會有成熟的解決方案,首先試試社區(qū)的解決方案。

<div id="capture" style="padding: 10px; background: #f5da55">
    <h4 style="color: #000; ">Hello world!</h4>
</div>
html2canvas(document.querySelector("#capture")).then(canvas => {
    document.body.appendChild(canvas)
});

以上是官網的實例用法。在網頁上出現了一個新的 canvas DOM。接下來我們只需要把canvas轉換成圖片就好。這里使用canva原生的toDataURL和toBlob方法上次到七牛云。

使用時需要注意。此處如果生產的畫布中有跨域圖片,需要配置allowTaint為true。

如果是原生canvas實現,canvas需要所有跨域圖片請求完成才可繪制。有兩種解決方案

  • 方案1:在html上寫好img標簽,src寫好對應的圖片url。缺點很明顯,會污染頁面的布局結構。
  • 方案2:使用js,使用new Image()的方式。設置src到對應的圖片url,在onload回調中處理相關操作。優(yōu)點:可行性最高,不過有回調地獄的問題。我們用Promise改寫一下
function asyncImage(url) {
    const img = new Image();
    img.src = url;
    img.setAttribute('crossOrigin', 'anonymous');
    return new Promise((resolve, reject) => {
        img.onload = () => resolve(img);
        img.onerror = reject;
    });
}

好的,大功告成~是不是可以交付需求了呢?開開心心提測,但是在移動端測試的時候發(fā)現生產的圖片非常模糊。這樣是不行的,明顯low了許多(測試不給過orz)。

github有相應的解決方案 傳送門 ,這個回答也是解決很多人的問題

基本原理:將canvas寬高放大兩倍。把css把canvas的style設置成1倍大小。

    var shareContent = YourTargetElem; 
    var width = shareContent.offsetWidth; 
    var height = shareContent.offsetHeight; 
    var canvas = document.createElement("canvas"); 
    var scale = 2 || window.devicePixelRatio ; //也可以使用設備像素比

    canvas.width = width * scale; 
    canvas.height = height * scale; 
    canvas.getContext("2d").scale(scale, scale); 

    var opts = {
        scale: scale, 
        canvas: canvas, 
        logging: true, 
        width: width, 
        height: height 
    };
    html2canvas(shareContent, opts).then(function (canvas) {
        var context = canvas.getContext('2d');

        var img = Canvas2Image.convertToImage(canvas, canvas.width, canvas.height);

        document.body.appendChild(img);
        $(img).css({
            "width": canvas.width / 2 + "px",
            "height": canvas.height / 2 + "px",
        })
    });

原理我們已經知道了,實際操作之后圖像也確實清晰了很多。但是問題還是沒有解決掉。

縮小雖然提高了清晰度,但是我們需要的圖片是原始比例的大小。。

最終多次嘗試無果后,選擇放棄使用框架。直接用原生canvas擼一個!

canvas繪制

我們知道,在高清屏的設備下,任何繪制canvas中的圖像、文字、線條、形狀都可能會出現模糊的問題??赏ㄟ^引入 GitHub 中的 hidpi-canvas 有效地解決。

  1. 首先去 GitHub 下載 hidpi-canvas.js 文件:傳送門
  2. 在項目中引入 hidpi-canvas.js 文件;
  3. 調用 getPixelRatio() 函數,得到 ratio 值;
  4. 在 drawImage() 中,將 width 和 height 乘以 ratio;
  5. 最終的canvas導出為Blog,轉換成文件對象上傳七牛云。

核心代碼如下

    function asyncImage(url) {
        const img = new Image();
        img.src = url;
        img.setAttribute('crossOrigin', 'anonymous');
        return new Promise((resolve, reject) => {
            img.onload = () => resolve(img);
            img.onerror = reject;
        });
    }
    async function drawCanvas(){
        var canvas = document.querySelector('canvas');
        var context = canvas.getContext('2d');
        var ratio = getPixelRatio(context);  // 關鍵代碼
        canvas.width = 300 * ratio; // 畫布寬度
        canvas.height = 300 * ratio; // 畫布高度
        var divWidth = 300 * ratio; // 用于內容居中
        var divHeight = 300 * ratio; // 用于內容居中
        const image = await asyncImage('picUrl')
        const imgWidth = 550
        const imgHeight = 300
        context.drawImage(this, 50, 50, imgWidth * ratio, imgHeight * ratio)
        // Some other code
        const Blob = canvas.toBlob((Blob)=>{
            //上傳七牛云
        });
    } 

最終生成的圖片終于清晰了...只需要根據dom的offsetWidth等適配不同屏幕就可以了。

總結

如果對圖片的清晰度要求不高,或者圖片需求是生成縮略圖的情況下。采用 html2canvas 是非常不錯的選擇。
否則,還是用canvas繪制出的圖片更清晰。

到此這篇關于JS如何實現頁面截屏功能的文章就介紹到這了,更多相關JS頁面截屏功能內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • js如何判斷用戶是否是用微信瀏覽器

    js如何判斷用戶是否是用微信瀏覽器

    微信內置瀏覽器屏蔽了下載鏈接,如果用戶是用微信內置瀏覽器打開的,則提示用戶換一個瀏覽器打開頁面,那么該如何判斷用戶是否是用微信瀏覽器呢
    2014-06-06
  • js實現淘寶首頁的banner欄效果

    js實現淘寶首頁的banner欄效果

    這篇文章主要為大家詳細介紹了js實現淘寶首頁的banner欄效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • 微信小程序實現登錄注冊界面

    微信小程序實現登錄注冊界面

    這篇文章主要為大家詳細介紹了微信小程序實現登錄注冊界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-08-08
  • bootstrap側邊欄圓點導航

    bootstrap側邊欄圓點導航

    這篇文章主要為大家詳細介紹了bootstrap側邊欄圓點導航效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-01-01
  • js中switch語句的學習筆記

    js中switch語句的學習筆記

    在本文里小編給各位分享的是關于js中switch語句的使用方法及學習筆記內容,有興趣的朋友們可以參考下。
    2020-03-03
  • JS 獲取頁面尺寸的方法詳解

    JS 獲取頁面尺寸的方法詳解

    通過 JS 獲取頁面相關的尺寸是比較常見的操作,尤其是在動態(tài)計算頁面布局時,今天我們就來學習一下幾個獲取頁面尺寸的基本方法,需要的朋友可以參考下
    2023-09-09
  • javascript鼠標右鍵菜單自定義效果

    javascript鼠標右鍵菜單自定義效果

    設計專屬于自己的右鍵菜單,添加自己需要的快捷方式,本文就為大家分享自定義javascript鼠標右鍵菜單的實現方法,感興趣的小伙伴們可以參考一下
    2016-02-02
  • 用Webpack構建Vue項目的實踐

    用Webpack構建Vue項目的實踐

    這篇文章主要介紹了用Webpack構建Vue項目的實踐,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • JavaScript實現的背景自動變色代碼

    JavaScript實現的背景自動變色代碼

    這篇文章主要介紹了JavaScript實現的背景自動變色代碼,涉及JavaScript數組操作結合定時函數實現修改頁面元素樣式的相關技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-10-10
  • 子窗體與父窗體傳值示例js代碼

    子窗體與父窗體傳值示例js代碼

    子窗體與父窗體之見互相傳值實現使用中很頻繁,本文以一個小示例拋磚引玉,希望大家可以舉一反三
    2013-08-08

最新評論