记录vue3+Vant+html2canvas实现生成海报功能(包含头像和二维码)

思路:头像是微信获取头像,二维码由后端返回的活动的二维码

HMTL代码:

    <div class="share-btn">
      <van-button class="btn-class" @click="toImg">个人海报</van-button>
    </div>
    <!-- 海报 -->
    <van-popup v-model:show="popupShow" @closed="closPop">
      <div class="popup" v-show="postShow">
        <div id="html-canvas">
          <div class="poster">
            <img
              class="poster-img"
              :src="scoreImage"
              crossorigin="anonymous"
              alt=""
            />
            <div class="head-img">
              <img
                :src="posterImg"
                alt=""
                crossorigin="anonymous"
                @load="imgLoad"
              />
            </div>
            <div class="user">
              {{ userName }}
            </div>
            <div class="qr-code">
              <img :src="actQrcode" alt="" crossorigin="anonymous" />
            </div>
          </div>
        </div>
        <div class="poster-btn" id="shareBtn">
          <!-- <van-button round type="primary" @click="generatePoster"
              >复制分享海报</van-button
            > -->
          <van-button
            color="#111111"
            type="primary"
            @click="download"
            icon="share-o"
            class="custom-button"
            >我要分享</van-button
          >
        </div>
      </div>
    </van-popup>

javascript代码:

import { showLoadingToast } from "vant";
import poster1 from "@/assets/poster/poster1.jpg";
import poster2 from "@/assets/poster/poster2.jpg";
import poster3 from "@/assets/poster/poster3.jpg";
import html2canvas from "html2canvas"; // 引入html2canvas
//默认的微信头像
const headimgurl = localStorage.getItem("headimgurl");
//海报弹框显示
const popupShow = ref(false);
//海报图片显示
const postShow = ref(false);
//根据分数输出不同海报底图
const scoreImage = computed(() => {
  if (achievement.value.score < 60) {
    return poster1; // 第一阶段图片路径
  } else if (achievement.value.score < 90) {
    return poster2; // 第二阶段图片路径
  } else {
    return poster3; // 第三阶段图片路径
  }
});

//个人海报按钮
const toImg = () => {
  popupShow.value = true;
};
//我要分享按钮
function download() {
  const showLoading = showLoadingToast({
    message: "海报生成中,请稍等",
    forbidClick: true,
    loadingType: "spinner",
    duration: 0,
  });
  // 获取要生成海报的DOM元素
  const element = document.getElementById("html-canvas");
  nextTick(() => {
    html2canvas(element, {
      width: element.clientWidth, // 生成图片的宽度
      height: element.clientHeight,// 生成图片的gaodu
      backgroundColor: null,//背景色
      useCORS: true, // 如果截图的内容里有图片,可能会有跨域的情况,加上这个参数,解决文件跨域问题
      allowTaint: false, //确保画布不会被标记为“已污染”,从而允许导出图像数据
    }).then((canvas) => {
      const img = new Image();
      img.src = canvas.toDataURL("image/png");
      // 设置图片样式
      img.style.width = "100%";
      img.style.height = "auto";
      // 替换原始内容
      element.innerHTML = "";
      element.appendChild(img);
      // 隐藏分享按钮
      const shareBtn = document.getElementById("shareBtn");
      if (shareBtn) {
        shareBtn.style.display = "none";
      }
      // 添加提示文字
      const hintText = document.createElement("p");
      hintText.textContent = "长按分享或保存";
      hintText.style.textAlign = "center";
      hintText.style.marginTop = "20px";
      hintText.style.fontSize = "20px";
      hintText.style.color = "#fff"; // 你可以根据需要调整颜色
      hintText.style.fontWeight = "bold"; // 你可以根据需要调整颜色
      element.appendChild(hintText);
      img.onload = function () {
        console.log("图片加载完毕!");
        if (showLoading) showLoading.close();
      };
    });
  });
}

css代码:

#html-canvas {
  width: 20rem;
  height: 100%;
  .poster {
    position: relative;
    .poster-img {
      width: 100%;
      height: auto;
    }
    .head-img {
      position: absolute;
      top: 6.25rem;
      left: 10.375rem;
      transform: translateX(-50%);
      img {
        width: 8rem;
        height: 8rem;
        border-radius: 10%;
      }
    }
    .user {
      position: absolute;
      top: 16.75rem;
      right: 14rem;
      font-size: 1.125rem;
      font-weight: 600;
    }
    .qr-code {
      position: absolute;
      bottom: 4rem;
      left: 120px;
      img {
        width: 5rem;
        height: 5rem;
      }
    }
  }
}

效果图:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值