html to canvas使用踩坑记录

import html2canvas from "html2canvas";

export const htmltocanvas = (id) => {
  var canvas = document.createElement("canvas");
  canvas.width = document.getElementById(id).clientWidth;
  canvas.height = document.getElementById(id).clientHeight;
  return new Promise((resolve, reject) => {
    html2canvas(document.getElementById(id), {
      canvas: canvas,
      scale: 2, //图片模糊可以先放大
      useCORS: true,
    }).then((canvas) => {
      var context = canvas.getContext("2d");
      context.mozImageSmoothingEnabled = false;
      context.webkitImageSmoothingEnabled = false;
      context.msImageSmoothingEnabled = false;
      context.imageSmoothingEnabled = false;   //开启防锯齿
      resolve(canvas.toDataURL("image/jpeg")); //jpeg格式更兼容,避免部分机型图片不显示

    });

    
  });
};
<img crossOrigin="anonymous" :src="imgUrl" alt="" />

 问题1:部分机型不适配高版本的 "html2canvas"会出现文字消失的情况

方案:使用 "^1.0.0-rc.4"版本 

问题2:出现生成的图片消失的情况

原因:未知

方案:

img.onload = () => {
      document.body.appendChild(img);
    };
    img.src = imgurl.value;
    img.style.display = "block";
    img.style.width = "8.93rem";
    img.style.margin = "1.35rem auto";
    img.style.borderRadius = "0.3rem";
    img.style.boxShadow = "0 0.09rem 0.75rem 0 #c8c8c8ff";
}

问题3:应该绘制到canvas上的图片消失

原因:可能是图片加载慢于canvas转换

方案:使用settimeout,时间为0的宏任务执行htm2canvas

问题4:动态生成二维码为空白

原因:生成二维码需要时间

方案:二次封装生成二维码的函数,使之异步,await生成二维码之后,再使用nexttick或者settimeout调用html2canvas

export const createQrcodeFn = (link, id) => {
  //清空上一个二维码
  document.getElementById(id).innerHTML = "";
  const result = new QRCode(document.getElementById(id), {
    text: link,
    width: 400,
    height: 400,
    colorDark: "#000000",
    colorLight: "#ffffff",
    correctLevel: QRCode.CorrectLevel.H,
  });

  return new Promise((resolve, reject) => {
    resolve(result);
  });
};

问题5:生成图片有白边

原因:可能有元素或滚动条占位,绘制图片之前滚动页面也会导致有白边,需要绘制的元素最好不要写在dialog等自带margin等属性的元素内

方案:

window.scrollTo(0, 0);
//或添加// x: document.getElementById(id).getBoundingClientRect().left, // 绘制的dom元素相对于视口的位置

body {
  overflow-y: overlay;
}

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值