html2canvas踩坑之滾動(dòng)條凉唐、ios13.6兼容

1,帶滾動(dòng)條的繪制(PC端)

需求如下:


需求.png

效果圖:


效果.png

實(shí)現(xiàn)方式及注意事項(xiàng):

  • 使用的是 html2canvas 1.0.0-rc.1 版本
  • html頁(yè)面結(jié)構(gòu)說(shuō)明
    • div.export-canvas 是定高虱咧、帶滾動(dòng)條的容器
    • prepareRef 是繪制區(qū)域
    • 背景圖熊榛、圖片均放在了項(xiàng)目里面(如果是網(wǎng)絡(luò)圖片,需要轉(zhuǎn)換為base64)
    • “導(dǎo)出預(yù)習(xí)表?yè)P(yáng)榜”是一個(gè)a標(biāo)簽腕巡,herf=繪制結(jié)束之后的圖片地址
  • 注意: 虛線繪制后是實(shí)線,對(duì)這個(gè)功能來(lái)說(shuō)影響不大
html結(jié)構(gòu).png

點(diǎn)擊“生成圖片"對(duì)應(yīng)的方法:

  makeCanvasFun(ref){
        let that = this;
        //rc.1版本不需要設(shè)置width/windowWidth等屬性,不然發(fā)布到線上 圖片空白
        html2canvas(that.$refs[ref],{
          async: true,
          backgroundColor: null,
          scale:2
        }).then((canvas) => {
          let dataURL = canvas.toDataURL("image/png");
          let tmpBlob = that.base64ToBlob(dataURL); //[object blob]
          that.prepareUrl = window.URL.createObjectURL(tmpBlob);//base64轉(zhuǎn)換為blob格式的圖片血筑,便于 a 標(biāo)簽的 download
        }).catch((e) => {
          console.log('canvas catch e.message',e.message)
          console.log(e);
        });
      },

2绘沉,兼容ios13.6+(微信h5頁(yè)面)

需求效果如下:

  • 選擇圖片,并可以旋轉(zhuǎn)豺总、縮放上傳的圖片
  • 用戶頭像车伞、變化的二維碼
  • 手機(jī)端生成海報(bào)圖


    需求.png
效果.png

實(shí)現(xiàn)方式:

  • html2canvas 版本號(hào) 1.0.0-rc.5 ,引用js及解決方案
  • 上傳的圖片file轉(zhuǎn)換為base64
  • 圖片的移動(dòng)和縮放使用的是 AlloyFinger
  • 背景圖使用的項(xiàng)目里的圖片喻喳,網(wǎng)絡(luò)圖片要是同域圖片然后轉(zhuǎn)換為base64
  • 頭像和二維碼圖片 均是同域圖片
  • html及部分js
<div class="poster-body">
      <!--createRef 為繪制區(qū)域-->
      <div class="poster-create" ref="createRef">
            <div class="pinch-box">
              <!--用戶上傳的圖片容器-->
              <img :src="imgUploadSrc" alt="" class="pinch-img"
                   id="pinchImg" >
            </div>
            <div class="poster-company">
              <!--海報(bào)固有的圖片另玖、二維碼、用戶信息等-->
              <!--<div class="nick">學(xué)生名chin(*^▽^*)</div>-->
              <img :src="userHead" alt="" id="j_user_header" class="avatar">
              <img :src="imgQrcode" alt="" id="j_user_code" class="qrcode">
              <img :src="posterBg" alt="" class="poster-bg">
            </div>
      </div>
</div>

      // input[type=file]的change事件  -- 選擇圖片之后
        changeFileFunc(ele){
          let that = this;
          let file = document.getElementById(ele).files[0]
          if(file){
            that.changeFileToBaseURL(file,function (base) {
              that.imgUploadSrc = base;
            }); //上傳的圖片的base64url
          }else{
            console.log('未選擇圖片')
          }
        },

        //將file文件轉(zhuǎn)換為base64
        changeFileToBaseURL(file,callback){
          let fileReader = new FileReader();
          if(file){
            fileReader.readAsDataURL(file);
            fileReader.onload = function (e) {
              let imgBase64Data = e.target.result; //也可以使用this.result,因?yàn)閠his 指向了 e.target
              callback(imgBase64Data);
            }
          }else{
            return null
          }
        },

    //將網(wǎng)絡(luò)圖片 轉(zhuǎn)換為base64,純js,不依賴jquery, imgUrl必須是同域
    changeOnlineImgToBaseUrl(imgUrl,callback){
          window.URL = window.URL || window.webkitURL;
          let xhr = new XMLHttpRequest()
          xhr.open("get",imgUrl,true);
          xhr.responseType = "blob"; //使用blob對(duì)象
          xhr.onload = function () {
            if(this.status ==200){
              var blob = this.response;
              let fileReader = new FileReader();
              fileReader.readAsDataURL(blob);
              fileReader.onload = function (e) {
                let imgBase64Data = e.target.result; 
                callback(imgBase64Data);
              }
            }else{
              console.log('xhr status 不是200 , ',this.status)
            }
          }
          xhr.send();
        },


//生成海報(bào)按鈕
createPosterFun(){
    let that = this;
    (window.html2canvas || html2canvas)(that.$refs.createRef,{
            useCORS:true,
            allowTaint:true,
            backgroundColor: null,
            scale:3
          }).then((canvas) => {
            let dataURL = canvas.toDataURL("image/png");
            that.finalUrl = dataURL; //最終顯示的圖片地址表伦,微信中長(zhǎng)按即可存儲(chǔ)

          }).catch((e) => {
            console.log('canvas catch e.message',e.message)
            console.log(e);
          });
}

參考文檔

名稱 默認(rèn) 描述
async true 是否異步解析和呈現(xiàn)元素
allowTaint false 是否允許跨原始圖像污染畫(huà)布
backgroundColor #ffffff 畫(huà)布背景顏色谦去,如果在DOM中未指定。設(shè)置 null 為透明
canvas null canvas 用作繪圖基礎(chǔ)的現(xiàn)有 元素
foreignObjectRendering false 是否在瀏覽器支持的情況下使用ForeignObject渲染
imageTimeout 15000 加載圖像的超時(shí)(以毫秒為單位)蹦哼。設(shè)置 0 為禁用超時(shí)鳄哭。
ignoreElements (element) => false 謂詞函數(shù),用于從渲染中刪除匹配元素纲熏。
logging true 啟用日志記錄以進(jìn)行調(diào)試
onclone null 在克隆文檔進(jìn)行渲染時(shí)調(diào)用的回調(diào)函數(shù)可用于修改將在不影響原始源文檔的情況下呈現(xiàn)的內(nèi)容妆丘。
proxy null Url到 代理 锄俄,用于加載跨源圖像。如果留空勺拣,則不會(huì)加載跨原始圖像奶赠。
removeContainer true 是否要清理克隆的DOM元素html2canvas會(huì)暫時(shí)創(chuàng)建
scale window.devicePixelRatio 用于渲染的比例。默認(rèn)為瀏覽器設(shè)備像素比率药有。
useCORS false 是否嘗試使用CORS從服務(wù)器加載圖像
width Element width canvas的寬度
height Element height canvas的高度
X Element x-offset 裁剪畫(huà)布x坐標(biāo)
Y Element y-offset 裁剪畫(huà)布y坐標(biāo)
scrollX Element scrollX 渲染元素時(shí)使用的x滾動(dòng)位置(例如毅戈,如果Element使用 position: fixed )
scrollY Element scrollY 渲染元素時(shí)使用的y滾動(dòng)位置(例如,如果Element使用 position: fixed )
windowWidth Window.innerWidth 渲染時(shí)使用的窗口寬度 Element 塑猖,可能會(huì)影響媒體查詢等內(nèi)容
windowHeight Window.innerHeight 渲染時(shí)使用的窗口高度 Element 竹祷,這可能會(huì)影響媒體查詢等內(nèi)容
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市羊苟,隨后出現(xiàn)的幾起案子塑陵,更是在濱河造成了極大的恐慌,老刑警劉巖蜡励,帶你破解...
    沈念sama閱讀 216,591評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件令花,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡凉倚,警方通過(guò)查閱死者的電腦和手機(jī)兼都,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)稽寒,“玉大人扮碧,你說(shuō)我怎么就攤上這事⌒硬冢” “怎么了慎王?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,823評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宏侍。 經(jīng)常有香客問(wèn)我赖淤,道長(zhǎng),這世上最難降的妖魔是什么谅河? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,204評(píng)論 1 292
  • 正文 為了忘掉前任咱旱,我火速辦了婚禮,結(jié)果婚禮上绷耍,老公的妹妹穿的比我還像新娘吐限。我一直安慰自己,他們只是感情好锨天,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,228評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布毯盈。 她就那樣靜靜地躺著,像睡著了一般病袄。 火紅的嫁衣襯著肌膚如雪搂赋。 梳的紋絲不亂的頭發(fā)上赘阀,一...
    開(kāi)封第一講書(shū)人閱讀 51,190評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音脑奠,去河邊找鬼基公。 笑死,一個(gè)胖子當(dāng)著我的面吹牛宋欺,可吹牛的內(nèi)容都是我干的轰豆。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼齿诞,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼酸休!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起祷杈,我...
    開(kāi)封第一講書(shū)人閱讀 38,923評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤斑司,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后但汞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體宿刮,經(jīng)...
    沈念sama閱讀 45,334評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,550評(píng)論 2 333
  • 正文 我和宋清朗相戀三年私蕾,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了僵缺。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,727評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡踩叭,死狀恐怖磕潮,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情容贝,我是刑警寧澤揉抵,帶...
    沈念sama閱讀 35,428評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站嗤疯,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏闺兢。R本人自食惡果不足惜茂缚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,022評(píng)論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屋谭。 院中可真熱鬧脚囊,春花似錦、人聲如沸桐磁。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,672評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)我擂。三九已至衬以,卻和暖如春缓艳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背看峻。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,826評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工阶淘, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人互妓。 一個(gè)月前我還...
    沈念sama閱讀 47,734評(píng)論 2 368
  • 正文 我出身青樓溪窒,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親冯勉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子澈蚌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,619評(píng)論 2 354