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>
相关推荐
小码哥_常3 小时前
一套自己部署的 IM,客户端是同一份 Flutter
前端·后端
蜗牛攻城狮6 小时前
微前端四大方案选型对比与最佳实践:qiankun、micro-app、wujie、Module Federation
前端·微前端·qiankun·前端架构·micro-app·wujie
她说可以呀7 小时前
Vue插槽
前端·javascript·vue.js
qq_448011167 小时前
Vue + Jinja2两套模版与法冲突造成undefinedError
前端·javascript·vue.js
aixingpan8 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
2601_958352908 小时前
23.5×19mm 换掉一整条音频链?|A-68 集成了什么:ADC / DAC / 24.576MHz 时钟 / AEC / 波束降噪,主控仅需 6 根线
前端·音视频·ai降噪·回声消除·语音模块
志尊宝9 小时前
AI原生前端开发(039):AI辅助的Nuxt 4全栈开发
前端·vue.js·ai-native
FRing0310 小时前
JavaScript入门到精通三十二(深拷贝、浅拷贝、递归函数)
开发语言·前端·javascript
excel10 小时前
双 Token 与前端使用 Crypto 公私钥鉴权换 Token,哪种方案更好?
前端·后端
外收内放10 小时前
Python基础语法练习题(73)
java·前端·python