Vue 3 + TypeScript 实现自定义水印功能

42 阅读2分钟

本文将介绍如何在 Vue 3 项目中使用 TypeScript 实现自定义水印功能。通过使用 canvas 特性生成 base64 格式的图片文件并设置其字体大小、颜色等,将其设置为背景图片,从而实现页面或组件的水印效果。

思路

  1. 使用 canvas 特性生成 base64 格式的图片文件,并设置字体大小、颜色等属性。 2. 将生成的图片设置为背景图片,实现页面或组件的水印效果。

实现代码

/*
  需求:给整个页面添加背景水印。

  思路:
    1、使用 canvas 特性生成 base64 格式的图片文件,设置其字体大小,颜色等。
    2、将其设置为背景图片,从而实现页面或组件水印效果
  
  使用:设置水印文案,颜色,字体大小即可
  <div v-waterMarker="{text:'版权所有',textColor:'rgba(180, 180, 180, 0.4)'}"></div>
*/

import type { Directive, DirectiveBinding } from "vue";
const addWaterMarker: Directive = (str: string, parentNode: any, font: any, textColor: string) => {
	// 水印文字,父元素,字体,文字颜色
	let can: HTMLCanvasElement = document.createElement("canvas");
	parentNode.appendChild(can);
	can.width = 205;
	can.height = 140;
	can.style.display = "none";
	let cans = can.getContext("2d") as CanvasRenderingContext2D;
	cans.rotate((-20 * Math.PI) / 180);
	cans.font = font || "16px Microsoft JhengHei";
	cans.fillStyle = textColor || "rgba(180, 180, 180, 0.3)";
	cans.textAlign = "left";
	cans.textBaseline = "Middle" as CanvasTextBaseline;
	cans.fillText(str, can.width / 10, can.height / 2);
	parentNode.style.backgroundImage = "url(" + can.toDataURL("image/png") + ")";
};

const waterMarker = {
	mounted(el: DirectiveBinding, binding: DirectiveBinding) {
		addWaterMarker(binding.value.text, el, binding.value.font, binding.value.textColor);
	}
};

export default waterMarker;

说明

  • str: 水印文字内容。
  • parentNode: 水印添加到的父元素。
  • font: 水印文字的字体样式,默认为 "16px Microsoft JhengHei"
  • textColor: 水印文字的颜色,默认为 "rgba(180, 180, 180, 0.3)"

通过上述代码和使用示例,您可以在 Vue 3 项目中轻松实现自定义水印功能。根据实际需求,调整水印的文字内容、字体和颜色等参数,确保达到理想的效果。