html2canvas生成图片空白或缺失问题解决

最近接到反馈,先前做的一个小工具会出现一些bug 主要原理是根据用户填写的内容生成一个隐藏起来的节点,并把这个节点截取生成图片下载下来;

首先把这个节点显示出来发现节点是正常的

那么问题就出现在获取节点上,这里使用到了html2canvas将节点转化为 base64 格式的图片,打印一下这个文件:
ok, 是空白的;

当页面缩小及生成图片滚动页面时,会出现类似问题,后来发现是页面有滚动条时会出现截图失败;
查阅文档还可以通过获取截图范围的精确位置截图;

我们需要的是截图区域左上角的 x, y 坐标,以及截图区域的宽高;

const dom = $(".creatSign-layout”);
x 坐标:dom.offset().left
y 坐标:dom.offset().top

在获取节点的 x, y 坐标时,发现用 dom.offsetLeft, dom.offsetTop 位置不准确,原因是:

offsetLeft / offsetTop
在页面任一元素的offsetLeft总是找到离其最近的已经定位的父元素或祖先元素定位,如果没有,就根据根节点body定位,然后获取其left值。

offset().left / offset().top
返回或设置匹配元素相对于文档的偏移(位置)。 无论元素的父元素或祖先元素的position属性是什么,总是计算相对于文档的位置。

以下是使用 html2canvas 生成 canvas,并下载为图片的完整代码:

toImage() {
setTimeout(function () {
const dom = $(".creatSign-layout”);   // 要截取为图片的 dom 节点 
const containerDom = $(".router-view-content");
console.log( dom.offset(),'num')
html2canvas(document.querySelector(".creatSign-layout"), {
scale: 2,
dpi: 300,
x: dom.offset().left,
y: dom.offset().top,
width: 556,
height: 168,
removeContainer:true
}).then(function (canvas) {
let dataURL = canvas.toDataURL("image/jpg");
console.log(dataURL);
function base64ToBlob(img) {
let parts = img.split(";base64,");
let contentType = parts[0].split(":")[1];
let raw = window.atob(parts[1]);
let rawLength = raw.length;
let uInt8Array = new Uint8Array(rawLength);
for (let i = 0; i < rawLength; ++i) {
uInt8Array[i] = raw.charCodeAt(i);
}
return new Blob([uInt8Array], { type: contentType });
}
const blob = base64ToBlob(dataURL);
let evt = document.createEvent("HTMLEvents");
evt.initEvent("click", true, true);
let aLink = document.createElement("a");
aLink.download = "邮件签名";
aLink.href = URL.createObjectURL(blob);
aLink.click();
});
});
},
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值