效果图

image.png
image.png

在vue项目中通过自定义指令,使用canvas特性生成base64格式的图片文件,创建div并将其设置为背景图片,再定位到想要添加水印的地方(或者直接设置背景图片),从而实现页面或组件局部水印效果。

1.创建warterMark.js

  1. /*
  2. * @description:
  3. * @author: 王浩
  4. * @Date: 2022-09-19 10:44:09
  5. * @Modified By:
  6. * @version: 1.0.0
  7. */
  8. import Vue from "vue";
  9. Vue.directive("watermark", {
  10. bind: function (el, binding) {
  11. function addWaterMarker(parentNode, str, width, height, font, textColor, isShow = true, fillTextX = "10") {
  12. console.log("水印文字", str, isShow);
  13. // 检查父元素是否包含子元素
  14. const elementContains = (parent, child) => parent !== child && parent.contains(child);
  15. const flag = elementContains(parentNode, document.querySelector("canvas"));
  16. // 防止重复创建
  17. if (!flag) {
  18. let can = document.createElement("canvas");
  19. parentNode.appendChild(can);
  20. can.width = width || 200;
  21. can.height = height || 140;
  22. can.style.display = "none";
  23. console.log(can.style.display);
  24. let cans = can.getContext("2d");
  25. cans.rotate((-20 * Math.PI) / 180);
  26. cans.font = font || "13px Microsoft Yahei";
  27. cans.fillStyle = textColor || "#DDDDDD";
  28. cans.textAlign = "left";
  29. cans.textBaseline = "Middle";
  30. cans.fillText(str, fillTextX, can.height);
  31. // 设置背景图(整个项目中都添加水印建议使用此方法)
  32. // parentNode.style.backgroundImage = "url(" + can.toDataURL("image/png") + ")";
  33. // 创建div 定位覆盖(某个元素,如图片添加水印建议使用此方法)
  34. let div = document.createElement("div");
  35. // 判断是否显示水印
  36. if (!isShow) {
  37. div.style.display = "none";
  38. }
  39. div.id = str;
  40. div.style.pointerEvents = "none";
  41. div.style.top = "0";
  42. div.style.left = "0";
  43. div.style.position = "absolute";
  44. div.style.zIndex = "100000";
  45. div.style.width = "100%";
  46. div.style.height = "100%";
  47. div.style.background = "url(" + can.toDataURL("image/png") + ")";
  48. parentNode.appendChild(div);
  49. }
  50. }
  51. if (binding.value.text) {
  52. addWaterMarker(
  53. el, // 父元素
  54. binding.value.text, //水印文字
  55. binding.value.width, //画布宽度
  56. binding.value.height, //画布高度
  57. binding.value.font, //字体
  58. binding.value.textColor, //文字颜色
  59. binding.value.isShow, //是否显示水印
  60. binding.value.fillTextX, //画布横坐标
  61. );
  62. }
  63. },
  64. });

2. 引入main.js当中

我的warterMark.js文件在directive目录下
image.png

  1. import '@/directive/warterMark.js'

3.调用指令

image.png
如果希望在整个项目中都添加水印,可以在app.vue中使用指令

  1. <template>
  2. <div id="app">
  3. <router-view v-watermark="{text: '水印名称', textColor: 'rgba(180, 180, 180, 0.3)'}" />
  4. </div>
  5. </template>

如果希望给图片添加水印
image.png

  1. <template>
  2. <div v-watermark="{text: '水印名称', textColor: 'rgba(180, 180, 180, 0.3)'}" >
  3. <img src="" alt="" >
  4. </div>
  5. </template>