美文网首页
html2canvas---踩坑记录

html2canvas---踩坑记录

作者: 修齐治平zzr | 来源:发表于2021-01-07 17:30 被阅读0次
       h5开发中,我们经常会遇到类似‘长按界面保存图片’之类的需求,一般情况下只需要img标签即可长按调用系统级api来保存单张图片或识别二维码。
       但是如果涉及到整个可视界面的保存,则就需要方法把整个界面转化成图片,此时html2canvas.js则是我们的不二之选。
    npm install --save html2canvas 
    yarn add html2canvas
    
    import html2canvas from 'html2canvas';
    
    componentDidMount() {
      html2canvas(document.body,{
      // options
      }).then(canvas) {
        let base64 = canvas.toDataURL("image/png", 2.0);
        let ele = document.createElement("img");
          ele.setAttribute("src", base64);
          ele.style.width = "100%";
          ele.style['min-height'] = "100%";
          ele.style.top = '0px';
          ele.style.zIndex = 9999;
          ele.style.position = "absolute";
          document.body.appendChild(ele);
      } 
    }
    

    option常见可配置项

    imageTimeout: 生成图片超时时间,如果设置为0,则不限时间。若超时,控制台会输出报错信息,
    ignoreElements: (element) => false 渲染忽略元素,
    logging: 布尔值,方便我们定位问题
    onclone:  函数类型,在这里你可以操作生成canvas的dom的节点,
    removeContainer: 布尔值,默认为true, 是否清理临时dom节点,
    x:偏移x轴的距离,
    y:偏移y轴的距离,
    scrollX:渲染元素时x轴滚动的距离,
    scrollY:渲染元素时y轴滚动的距离,
    windowWidth:窗口宽度,
    windowHeight:窗口高度
    
       使用方法非常简单,但是稍有不慎就会出现各种各样的问题,因为html2canvas做的是把当前状态下的选中的静态dom转化为canvas,并未涉及到界面滚动,以及一些默认css样式与浏览器默认样式的出入。导致html2canvas‘坑’特别多!

    下面盘点一下我在html2canvas中遇到的部分问题,希望能帮到您

    1.最常见的,如果界面存在滚动条,而滚动条并未处于顶端,则生成的图片只有当前可视区域。

          y: window.pageYOffset,
          windowHeight: document.body.scrollHeight
          // 只需要option配置y轴方向起点和视窗高度即可解决
    

    2.有时候生成图片不完整。

    // 1.可能是照片未加载完成就调用了生成图片的方法
    // 2.图片存在跨域问题
    
    // 请在window.onload回调函数中调用。或者界面加载时设置定时器
    generateImg = () => {
      html2canvas(document.body, () => {
        // options
      }).then(canvas){
        ...
      }
    }
    
    window.onload = () => {
      generateImg()
    }
    // 或者
    window.setTimeOut(() => {
      generateImg()
    }, 300)
    // 也可以将图片全部转化为base64编码,则不会存在img异步加载和跨域的问题
    // 图片跨域
    allowTaint: true,
    useCORS: true 
    

    3.生成的图片字体大小与dom中不同

    // 只需要css规定字体样式即可。html2canvas默认字体样式与浏览器默认不同。
    

    4.在ios下部分图片只显示一半的问题

    // 一次我写一个h5的活动界面,出现了一个问题,就是在安卓手机下正常展示无误,
    // 但是在ios下图片横向只显示了60%,还有剩下的百分之40是空白,
    // 最终通过样式调整定位出问题所在:
    // 该图片使用了transform: translateX(),因为此图片要求居中,所以我使用了绝对定位+left: 50% + translateX(-50%)组合。
    // 解决方式:
    // 1. 修改了居中方式,问题解决。left:0; right: 0
    // 2. 兼容苹果写法 -webkit-transform: translateX(-50%);
    

    相关文章

      网友评论

          本文标题:html2canvas---踩坑记录

          本文链接:https://www.haomeiwen.com/subject/bswnoktx.html