当前位置: 首页 > news >正文

vue3+ts+自定义指令,生产页面水印

页面水印一般包含了用户信息,比如姓名,工号,部门等信息,
这些信息是可以从接口获取到的,也可以从本地存储中获取到的,
这里我们就从本地存储中获取到用户信息,然后将其作为水印的内容。

// 获取水印要显示的信息
const getUserInfo:any = () => {let userInfo: any = localStorage.getItem('yourKey')userInfo = userInfo ? JSON.parse(userInfo) : {}// 这里可以增加其它内容return `${userInfo?.name}-${userInfo?.phone}`
}

我们还可以给水印做一个基本的配置,比如水印的颜色、字体大小、背景、等等。

/*** @param text 水印文字* @param font 水印字体* @param color 水印颜色* @param fontSize 水印字体大小* @param rotate 水印旋转角度* @param opacity 水印透明度* @param width 水印宽度* @param height 水印高度*/
const watermarkConfig:any = {font: 'Arial',color: 'rgba(191, 126, 126, 1)',fontSize: 14,rotate: 30,opacity: 0.2,width:200,height:150
}

下面是生成水印的代码

// 生成水印
/*** @param bindingValue 水印配置* @returns 水印样式*/
const getCanvas = (bindingValue: any) => {const { text, font = watermarkConfig.font, color = watermarkConfig.color, fontSize = watermarkConfig.fontSize, rotate = watermarkConfig.rotate, opacity = watermarkConfig.opacity } = bindingValue || {}const watermarkText = text || getUserInfo()// 创建水印画布const canvas = document.createElement('canvas')canvas.width = watermarkConfig.widthcanvas.height = watermarkConfig.heightconst ctx = canvas.getContext('2d')if (ctx) {ctx.font = `${fontSize}px ${font}`ctx.fillStyle = colorctx.globalAlpha = opacityctx.rotate(-rotate * Math.PI / 180)ctx.fillText(watermarkText, -20, canvas.height - 50)}// 将画布内容转换为 base64 编码的图片const base64Url = canvas.toDataURL()// 创建水印样式const watermarkStyle = `position: absolute;top: 0;left: 0;width: 100%;height: 100%;background-image: url('${base64Url}');background-repeat: repeat;pointer-events: none;`return watermarkStyle
}

配置在vue元素的生命周期钩子函数中,在挂载和更新的时候,触发水印的更新

const watermark = {mounted(el:any, binding:any) {// 创建水印元素const watermarkElement = document.createElement('div')watermarkElement.className = 'global-watermark'watermarkElement.style.cssText = getCanvas(binding.value)// 设置元素的定位为相对定位,以便水印元素可以相对于它定位el.style.position = 'relative'// 将水印元素添加到目标元素中el.appendChild(watermarkElement)},updated(el:any, binding:any) {// 当指令绑定的值更新时,重新生成水印const watermarkElement = el.querySelector('.global-watermark')if (watermarkElement) {el.removeChild(watermarkElement)}const newWatermarkElement = document.createElement('div')newWatermarkElement.style.cssText = getCanvas(binding.value)el.style.position = 'relative'el.appendChild(newWatermarkElement)}
}

在main.ts主入口中引入watermark,然后挂载在自定义指令方法上。

import watermark from '@/utils/waterMark'
app.directive('watermark', watermark)

最后在项目的.vue文件中直接v-watermark使用即可,可以根据不同的页面传入不同的参数v-watermark="",显示不同水印样式。

相关文章:

  • Linux云服务器配置git开发环境
  • 计算机操作系统 - 多级反馈队列比例份额
  • deeplabv3+街景图片语义分割,无需训练模型,看不懂也没有影响,直接使用,cityscapes数据集_23
  • 搭建spark yarn 模式的集群
  • 武汉火影数字|数字规划馆打造沉浸式数字化互动内容
  • 5月6日日记
  • n8n 与智能体构建:开发自动化 AI 作业的基础平台
  • 使用Java实现任务调度:从Timer到Quartz
  • 【CPU占用率查看】
  • 从零开始学习人工智能(Python高级教程)Day6-Python3 正则表达式
  • 《C语言中的结构体:数据组织的艺术》
  • 美信监控易:全栈式自主可控的底层架构优势
  • Qwen3简要介绍(截止20250506)
  • 基于ResNet50的手写符号识别系统
  • yolov8中的python基础--模块导入篇
  • Linux进程间通信(上)(21)
  • Marin说PCB之POC电路layout设计仿真案例---08
  • 在Fluent中使用Python脚本实现UDF并访问场数据和网格数据
  • GTC25 的 6G 会议
  • 【Linux我做主】深入探讨从冯诺依曼体系到进程
  • 央行将增加3000亿元科技创新和技术改造再贷款额度
  • 娱见 | 为了撕番而脱粉,内娱粉丝为何如此在乎番位
  • 从陈毅杯到小应氏杯,五一长假上海掀起围棋热
  • 李学明谈笔墨返乡:既耕春圃,念兹乡土
  • 人民日报头版:让青春之花绽放在祖国和人民最需要的地方
  • 中国驻日本大使吴江浩就日本民用飞机侵闯我钓鱼岛领空向日方提出严正交涉