html2canvas踩坑记

1,409 阅读2分钟

1.需求描述

前端根据学生名单拼接榜单图片,背景图片是后端接口动态获取的,而学生名单数量是不定的,在不改变图片宽度的情况下,图片高度是要随着学生数量动态变化的,并且图片不能拉伸变形

图片拼接方案设计如下图

首先,顶图和底图是后端配置,前端接口获取后通过<img />布局

中间绿色部分是学生榜单名单,动态渲染列表,中间也有背景,则是通过css的background:url() repeat 这个属性,1像素背景图片repeat布满中间content,下面贴个最后生成的样例图片吧

2 遇到问题

如何将页面不可见元素转为图片

html2canvas只能将页面上渲染的html元素转为图片,而产品期望不用预览就直接下载图片

  • 解决思路:将图片向上拉到-19999px,从而图片不在可视区域,达到隐藏元素的目的
// 榜单
.poster-download-unsee {
  margin-top: -999999999px; // 页面内元素不可见
  position: fixed; // 脱离文档流
}

当在窄屏浏览器下出现滚动条时,html转成的图片出现白屏,或者白边

解决:通过查阅得知,白边主要是因为滚动条出现的缘故,解决思路:用html2canvas转图片之前,先记录当前scrollLeft距离,然后滚动至距离浏览器最左上侧(0,0)处,待图片转成功后,回到之前的(scrollLeft,0)处

// 转base64 上传七牛云
    const imgWrap = document.getElementById(id);
    const { scrollLeft } = document.documentElement;
    // 先水平滚动至页面最左处
    window.scroll(0, 0);
    const canvas = await html2canvas(imgWrap, {
      useCORS: true,
      backgroundColor: null,
      // logging: isDevMode(),
      allowTaint: false });
    // 水平滚动至原处
    window.scroll(scrollLeft, 0);

       

背景图片1px报错,canvas高度变成0

最后通过定位到源码问题点,1px高的图片通过canvas的屏幕像素比除以2,莫名奇妙的就变成0了

解决思路:让UI重新切4px的背景图片,这样canvas的height就不会变为哦0了