vue项目页面添加水印实现方法

1、整体思路:

用 Canvas 画一个带旋转的文字水印 → 转成图片 → 当作 background-image 铺满整个页面 → 固定在页面最上层
2、核心流程图

javascript 复制代码
setWaterMark(str1, str2)
   ↓
setWatermark()
   ↓
创建 canvas
   ↓
canvas 上写字(旋转)
   ↓
canvas → base64 图片
   ↓
创建 div,用这张图做背景
   ↓
div fixed 覆盖全屏
   ↓
append 到 body

3、具体实现方法:

先创建一个watermark.js文件,代码如下

javascript 复制代码
  // 水印添加方法
  let setWatermark = (str1, str2) => {
    let id = 'watermark_id';
    if (document.getElementById(id) !== null) {
      document.body.removeChild(document.getElementById(id));
    }
    let can = document.createElement('canvas');
    // 设置canvas画布大小
    can.width = 350;
    can.height = 250;
    let cans = can.getContext('2d');
    cans.rotate(-20 * Math.PI / 180); // 水印旋转角度
    cans.font = '18px Vedana';
    cans.fillStyle = '#000000';
    cans.textAlign = 'center';
    cans.textBaseline = 'middle';
    cans.fillText(str1, can.width / 2, can.height) // 水印在画布的位置x,y轴
    cans.fillText(str2, can.width / 2, can.height + 22);
	
    let div = document.createElement('div')
    div.id = id;
    div.style.pointerEvents = 'none'; // 不拦截鼠标事件
    div.style.top = '40px';
    div.style.left = '0px';
    div.style.opacity = '0.10';
    div.style.position = 'fixed';
    div.style.zIndex = '100000';
    div.style.width = document.documentElement.clientWidth + 'px';
    div.style.height = document.documentElement.clientHeight  + 'px';
    div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat';
    document.body.appendChild(div);
    return id;
  }
 
  // 添加水印方法
  export const setWaterMark = (str1, str2) => {
    let id = setWatermark(str1, str2);
    if (document.getElementById(id) === null) {
      id = setWatermark(str1, str2);
    }
  }
 
  // 移除水印方法
  export const removeWatermark = () => {
    let id = 'watermark_id';
    if (document.getElementById(id) !== null) {
      document.body.removeChild(document.getElementById(id))
    }
  }

4、项目中具体使用:

如果是全局页面都使用,可以直接添加在app.vue页面中,如下:

javascript 复制代码
<template>
  <div id="app">
    <router-view />
  </div>
</template>
<script>
import { removeWatermark, setWaterMark } from '@/assets/js/watermark.js'
export default {
  name: 'App',
  beforeDestory(){
    removeWatermark();
  },
  data(){
    return {}
  },
  watch:{
    $route:{
      handler(val){
          setWaterMark("你好呀",this.getCurrentDateTime())
      },
      deep:true,
      immediate:true
    }
  },
  mounted(){},
  methods:{
    getCurrentDateTime() {
      const now = new Date();
      const year = now.getFullYear();
      const month = String(now.getMonth() + 1).padStart(2, '0');
      const day = String(now.getDate()).padStart(2, '0');
      const hour = String(now.getHours()).padStart(2, '0');
      const minute = String(now.getMinutes()).padStart(2, '0');

      return `${year}年${month}月${day}日${hour}点${minute}分`;
    }
  }
}
</script>
<style>
#nprogress .bar {
  background: rgb(233, 85, 110) !important;
}
</style>
相关推荐
ModyQyW26 分钟前
vite-plugin-uni-manifest 更新了什么
前端·typescript·uni-app
Asize2 小时前
AI 协作开发新范式:我用 SDD 做了个排版 npm 包
前端·人工智能
kyriewen3 小时前
我把今年流传的前端 AI 面试题整理了一遍——4 类场景题+回答框架(附速查表)
前端·面试·程序员
计算机魔术师3 小时前
国产多模态模型正面硬刚Opus旗舰:差距从30%缩到3%
前端
风骏时光牛马4 小时前
程序员进阶:深度思考,解锁职场成长的底层逻辑
前端
IT_陈寒4 小时前
用了Proxy才发现以前的JavaScript白写了
前端·人工智能·后端
爱丶不疚4 小时前
Eval: Agent 说的 Eval 是什么?从单测、TDD 到 Sentry 聊起
前端·ai编程·vibecoding
求道於盲4 小时前
python中的类型标注
前端
计算机魔术师4 小时前
从硅谷测试到全球铺开,ChatGPT广告的10亿美元秘密
前端
专业抄代码选手6 小时前
08|Fiber 上的 `useState`:状态终于属于具体组件
前端·javascript·react.js