• Vue全局添加水印


    首先创建一个js文件(shuiyin.js)

    // 定义水印函数
    const addWatermark = ({
      container = document.body, // 水印添加到的容器,默认为 body
      width = "200px", // 水印 canvas 的宽度
      height = "100px", // 水印 canvas 的高度
      textAlign = "center", // 水印文字的对齐方式
      textBaseline = "middle", // 水印文字的基线
      font = "16px Microsoft Yahei", // 水印文字的字体
      fillStyle = "rgba(184, 184, 184, 0.6)", // 水印文字的填充样式
      content = "我是水印", // 水印文字的内容
      rotate = -30, // 水印文字的旋转角度
      zIndex = 10000, // 水印的 z-index 值
    }) => {
      // 生成水印 canvas
      const canvas = document.createElement("canvas");
      canvas.setAttribute("width", width);
      canvas.setAttribute("height", height);
      const ctx = canvas.getContext("2d");
      ctx.textAlign = textAlign;
      ctx.textBaseline = textBaseline;
      ctx.font = font;
      ctx.fillStyle = fillStyle;
      ctx.rotate((Math.PI / 180) * rotate);
      ctx.fillText(content, parseFloat(width) / 2, parseFloat(height) / 1);
    
      // 将 canvas 转换为 base64 URL
      const base64Url = canvas.toDataURL("image/png");
      console.log(base64Url);
      const __wm = document.querySelector(".__wm");
      const watermarkDiv = __wm || document.createElement("div");
      const styleStr = `
                  position: fixed;
                  top: 0;
                  left: 0;
                  bottom: 0;
                  right: 0;
                  width: 100%;
                  height: 100%;
                  z-index: ${zIndex};
                  pointer-events: none;
                  background: url('${base64Url}') left top repeat;
              `;
      watermarkDiv.setAttribute("style", styleStr);
      watermarkDiv.classList.add("__wm");
      // 则创建一个 div 并设置样式和类名
    
      if (!__wm) {
        container.style.position = "relative";
        container.insertBefore(watermarkDiv, container.firstChild);
      }
      // 监听容器变化,当容器发生变化时重新调用 addWatermark 函数
      const { MutationObserver } = window;
      if (MutationObserver) {
        let mo = new MutationObserver(function () {
          const __wm = document.querySelector(".__wm");
          // 只在__wm元素变动才重新调用__canvasWM
          if ((__wm && __wm.getAttribute("style") !== styleStr) || !__wm) {
            // 避免一直触发
            mo.disconnect();
            mo = new MutationObserver(() => {});
    
            addWatermark({
              container: document.getElementById("app"),
              width: "200px",
              height: "100px",
              textAlign: "center",
              textBaseline: "middle",
              font: "16px Microsoft Yahei",
              fillStyle: "rgba(184, 184, 184, 0.3 )",
              content,
              rotate: -30,
              zIndex: 10000,
            });
          }
        });
    
        mo.observe(container, {
          attributes: true,
          subtree: true,
          childList: true,
        });
      }
    };
    
    export default addWatermark;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85

    main.js引入

    import addWatermark from "@/utils/shuiyin";
    Vue.use(addWatermark);
    
    • 1
    • 2
  • 相关阅读:
    Java-List<Map>的复制 深拷贝与浅拷贝
    【操作系统笔记】操作系统
    c# 实现定义一套中间SQL可以跨库执行的SQL语句
    NFS介绍与搭建
    事关Django的静态资源目录设置与静态资源文件引用(Django的setting.py中的三句静态资源(static)目录设置语句分别是什么作用?)
    Springboot、maven 打包瘦身,去除依赖的jar【springboot外置jar、配置文件】
    PostgreSQL 数据库实现公网远程连接
    行列式学习笔记(一)
    【RocketMQ】消息的存储
    IceRPC之深入理解调度管道->快乐的RPC
  • 原文地址:https://blog.csdn.net/weixin_44149821/article/details/134459489