vue2使用html2canvas进行截图

跟上篇博客一样,下面代码直接放到vue2的任意页面截图就好,代码如下

// 我这里安装的html2canvas版本信息如下(自行下载插件)
"html2canvas": "^1.0.0-rc.4",

页面的代码如下(粘贴到vue2任意页面直接运行即可)

<template>
  <div class="coach_daily">
    <div class="coach_daily-inline">
      <!-- 这里是我设置的截图区域,在这里面写的所有代码都会被截图到 -->
      牛逼牛逼牛逼牛逼牛逼
    </div>

    <div style="position: absolute;z-index: 11;top:0;width: 100%;">
      <div class="coach_daily_share" v-show="showDrawBtn" @click="sharePic">
        生成图片
      </div>

      <div class="share_pic_mask" @click="clearPicture" v-show="painted_src || showPicDrawing"></div>
      <div @touchmove.prevent class="pic-modal flex-col-between" v-show="painted_src || showPicDrawing">
        <!-- <div class="pic flex-col-center"> -->
        <img v-show="!showPicDrawing" class="painted_src" ref="pic" :src="painted_src" alt="" />
        <div v-if="ispt" class="save-pic-btn-pt">
          <div v-if="isAndroid" class="save-pic-btn-pt" @click="saveInWebviewAnd">
            保存图片
          </div>

          <div v-if="!isAndroid" class="save-pic-btn-pt" @click="saveInWebview">
            保存图片
          </div>
        </div>
        <div v-if="!ispt" class="save-pic-btn">
          长按图片保存
        </div>
      </div>
    </div>
  </div>
</template>

<script>
import html2canvas from 'html2canvas'
window.shareImg = function () { }
window.getQueryVariable = function (variable) {
  var query = window.location.search.substring(1)
  var vars = query.split('&')
  for (var i = 0; i < vars.length; i++) {
    var pair = vars[i].split('=')
    if (pair[0] == variable) {
      return pair[1] || ''
    }
  }
  return ''
}
export default {
  data () {
    return {
      ispt: false, // 判断是否在app里打开
      isAndroid: false, //是否是安卓
      isNew: false, //是否是新版
      showDrawBtn: true,
      painted_src: '',
      showPicDrawing: false,
    }
  },
  mounted () {
    this.ispt = !!window.getQueryVariable('ispt')
    this.isNew = !!window.getQueryVariable('isNew')
    this.isAndroid = !!window.getQueryVariable('isAndroid')
  },

  methods: {
    sharePic () {
      this.leaderboardphb = false
      const that = this
      that.showDrawBtn = false
      window.shareImg()
      that.$nextTick(() => {
        setTimeout(() => {
          // .coach_daily-inline设置截图范围的容器,需要截图哪个容器的就获取哪个容器
          html2canvas(document.querySelector('.coach_daily-inline'), {
            useCORS: true, // 【重要】开启跨域配置
            allowTaint: false, //允许跨域图片
            scale: 2, //按比例增加分辨率 (2=双倍).
            dpi: window.devicePixelRatio * 2, //设备像素比
			height: document.querySelector('.coach_daily-inline').clientHeight - 3, //防止白边
          }).then((canvas) => {
            that.painted_src = canvas.toDataURL()
            that.$nextTick(() => {
              let pic = that.$refs.pic
              // pic.style.height = '72vh'
              that.showPicDrawing = false
            })
          })
          that.showPicDrawing = true
        }, 500)
      })
    },
    //安卓
    saveInWebviewAnd () {
      window.android.downPic(this.painted_src.split('base64,')[1])
      this.clearPicture()
    },
    // WEBVIEW调用保存图片
    saveInWebview () {
      if (this.isNew) {
        window.webkit.messageHandlers.saveImg.postMessage([
          this.painted_src.split('base64,')[1],
        ])
      } else {
        window.saveImg(this.painted_src.split('base64,')[1])
      }
      this.clearPicture()
    },
    // 清空图片
    clearPicture () {
      this.painted_src = ''
      this.showPicDrawing = false
      this.showDrawBtn = true
      this.leaderboardphb = true
    },
  },
}
</script>

<style scoped lang="less">
.coach_daily {
  width: 100vw;
  height: 100vh;
  // height: auto;
  position: relative;
  overflow: hidden;
}

.share_pic_mask {
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.6);
  position: fixed;
  top: 0;
  left: 0;
  z-index: 99;
}

.pic-modal {
  background: #fff;
  border-radius: 0.26rem;
  font-size: 0.28rem;
  color: #929191;
  position: fixed;
  top: 8vh;
  // left: 15vw;
  left: calc(50% - 37.5vw);
  z-index: 999;


  .pic {
    height: 76vh;
  }

  .save-pic-btn {
    height: 6vh;
    line-height: 6vh;
  }


  .painted_src {
    border-top-left-radius: 0.2rem;
    border-top-right-radius: 0.2rem;
    width: 75vw;
    height: 7rem;
  }
}


.coach_daily_share {
  position: fixed;
  top: 1.128rem;
  right: 0;
  z-index: 999;
  padding: 0.13rem 0.26rem;
  backdrop-filter: blur(0.205rem);
  color: #333333;
  border-top-left-radius: 0.389rem;
  border-bottom-left-radius: 0.389rem;
  font-size: 0.23rem;
  cursor: pointer;
  border: 0.01rem solid rgba(255, 255, 255, 0.4);
}

.coach_daily-inline {
  width: 7.5rem;
  height: 10rem;
}
</style>

效果图
在这里插入图片描述

在这里插入图片描述

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萧寂173

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值