Vue全局添加水印

发布于:2024-04-27 ⋅ 阅读:(27) ⋅ 点赞:(0)

1.创建warterMark.js

/*水印配置*/
//声明 
let watermark = {}
//水印配置 
let setWatermark = (str1, str2, str3) => {
  let id = '1.23452384164.123412415'
  // 移除水印 判断
  if (document.getElementById(id) !== null) {
    document.body.removeChild(document.getElementById(id))
  }

  //创建画布
  let createCanvas = document.createElement('canvas')
  // 设置canvas画布大小
  createCanvas.width = 280 //宽度
  createCanvas.height = 220 //高度

  //创建Context2D对象作为2D渲染的上下文。
  let Context2D = createCanvas.getContext('2d')
  /*水印样式调整配置*/
  Context2D.font = '16px Vedana' //水印文字大小
  Context2D.fillStyle = '#000' //水印颜色 HEX格式,可使用red 或者rgb格式

  // 平移并斜着展示整个水印
  Context2D.translate(createCanvas.width / 2, createCanvas.height / 2)
  Context2D.rotate(-Math.PI / 6)

  // 第一段文字(较长)
  Context2D.fillText(str1, -Context2D.measureText(str1).width / 2, 0)

  // 第二段文字(较短)
  Context2D.font = '16px Vedana' // 可根据需要调整第二段文字的大小
  Context2D.fillText(str2, -Context2D.measureText(str2).width / 2, 30)

  // 第三段文字
  Context2D.font = '14px Vedana' // 可根据需要调整第三段文字的大小
  Context2D.fillText(str3, -Context2D.measureText(str3).width / 2, 60)

  //创建元素
  let createDiv = document.createElement('div')
  createDiv.id = id
  //水印默认设置
  createDiv.style.pointerEvents = 'none' //水印层事件穿透 让水印不阻止交互事件
  createDiv.style.top = '0px' //水印顶部距离
  createDiv.style.left = '0px' //水印左侧距离
  createDiv.style.opacity = '0.05' //水印透明度
  createDiv.style.position = 'fixed' //水印定位
  createDiv.style.zIndex = '100000' //水印样式优先显示
  createDiv.style.width = document.documentElement.clientWidth - 100 + 'px' //水印宽度
  createDiv.style.height = document.documentElement.clientHeight - 100 + 'px' //水印高度
  createDiv.style.background = 'url(' + createCanvas.toDataURL('image/png') + ') left top repeat' //水印显示(关键代码)
  document.body.appendChild(createDiv) //在指定元素节点的最后一个子节点之后添加节点
  return id
}

// 此方法只允许调用一次
watermark.set = (str1, str2, str3) => {
  let id = setWatermark(str1, str2, str3)
  //设置间隔
  setInterval(() => {
    if (document.getElementById(id) === null) {
      id = setWatermark(str1, str2, str3)
    }
  }, 500)
  //改变大小时执行
  window.onresize = () => {
    setWatermark(str1, str2, str3)
  }
}

export default watermark

2.在App.vue中引入

import Watermark from "../src/utils/warterMark";
//需要在watch里监听路由的变化从而重新加载水印
 watch: {
    $route(to, from) {
    //我是直接通过本地存储取得数据进行水印加载的也可以自定义
      let userObj = JSON.parse(localStorage.getItem("userInfo"));
      let companyName = userObj.tenantName;
      let userName = userObj.userName;
      let timer = userObj.loginDate.match(/^\d{4}-\d{2}-\d{2}/)[0];
      this.$nextTick(function () {
        //Watermark.set(companyName, userName, timer); //使用本地存储中的数据渲染
        Watermark.set('水印1', '水印2', '水印3'); //自定义数据渲染
      });
    },
  },
  //需要在页面加载完成后进行水印加载
  mounted() {
    let userObj = JSON.parse(localStorage.getItem("userInfo"));
    let companyName = userObj.tenantName;
    let userName = userObj.userName;
    let timer = userObj.loginDate.match(/^\d{4}-\d{2}-\d{2}/)[0];
     // Watermark.set(companyName, userName, timer); //使用本地存储中的数据渲染
        Watermark.set('水印1', '水印2', '水印3'); //自定义数据渲染
  },