html2Canvas生成海报兼容安卓和ios 基于vue框架下

1,093 阅读1分钟

前几天开发h5端dom节点生成海报,用了比较大众化的html2canvas插件,结果测试说ios不显示还有的苹果手机只截取了一半图另外部分是空白 于是就开启漫长的调试,修复bug之旅·· 经过多轮测试最终一下代码搞定了,完美兼容ios,安卓 顺带手修复了生成的图片模糊锯齿问题 下面是使用方式

//html部分
<div id="reportPoster"  >
     -------------------要生成海报内容的dom节点----------
</div>
<img  :src="imageUrl" />
 <button type="primary" @click="exportPoster" class="btn-box-left">生成海报</button>
//**1.导入html2canvas.js文件**
    import * as html2canvas  from '@/base/html2canvas2'
    
 // 最新海报兼容问题
 data(){
     return{
         imageUrl:null,
     }
 }
 exportPoster(){
      window.pageYOffset = 0;
      document.documentElement.scrollTop = 0;
      document.body.scrollTop = 0; 
      const shareContent = document.getElementById('reportPoster')
      var width = shareContent.offsetWidth; //生成海报dom 宽度
      var height = shareContent.offsetHeight; //获取dom 高度
      var canvas = document.createElement("canvas"); //创建一个canvas节点
      const scale = 2; //定义任意放大倍数 支持小数
      canvas.width = width * scale; //canvas 宽度 * 缩放
      canvas.height = height * scale; //定义canvas高度 *缩放
      var context = canvas.getContext('2d');
      // 【重要】关闭抗锯齿
      context.mozImageSmoothingEnabled = false;
      context.webkitImageSmoothingEnabled = false;
      context.msImageSmoothingEnabled = false;
      context.imageSmoothingEnabled = false; 
       var opts = {
          scale: scale, // 添加的scale 参数
          canvas: canvas, //自定义 canvas
          // allowTaint: true, //允许画布上有跨域图片 不建议使用 后面详细补充
          logging: true, //日志开关,便于查看html2canvas的内部执行流程
          width: width-1, //dom 原始宽度
          height: height-1,
          dpi:300,
          useCORS: true // [重要]开启跨域配置
      }; 
       setTimeout(()=>{
          html2canvas(shareContent,opts).then(function (canvas) { 
            var x = canvas.toDataURL('image/jpeg') 
            that.imageUrl = x 
            
           
          }).catch((err) => { 
          })
      },500) 
      
 }
      

**补充:重要 html2canvas一定要使用1.0.0-rc.4版本 html2canvas 1.0.0-rc.4 **html2canvas.hertzen.com