当前位置:首页 > VUE

vue实现水印

2026-03-07 05:17:38VUE

实现水印的基本原理

在Vue中实现水印通常通过CSS或Canvas技术完成。CSS方式适合简单文字水印,Canvas适合复杂水印(如图片、旋转文字等)。核心思路是创建一个覆盖全屏的半透明图层。

CSS方式实现水印

<template>
  <div class="watermark-container">
    <div class="watermark"></div>
    <!-- 页面其他内容 -->
  </div>
</template>

<style>
.watermark-container {
  position: relative;
}
.watermark {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  background-image: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200" opacity="0.1"><text x="20" y="30" transform="rotate(-30 100,100)" fill="gray">Watermark</text></svg>');
  background-repeat: repeat;
  z-index: 9999;
}
</style>

Canvas方式实现动态水印

<template>
  <div ref="watermarkContainer" class="content-container">
    <!-- 页面内容 -->
  </div>
</template>

<script>
export default {
  mounted() {
    this.createWatermark();
  },
  methods: {
    createWatermark() {
      const canvas = document.createElement('canvas');
      canvas.width = 200;
      canvas.height = 150;
      const ctx = canvas.getContext('2d');

      ctx.font = '16px Arial';
      ctx.fillStyle = 'rgba(128, 128, 128, 0.3)';
      ctx.rotate(-Math.PI / 6);
      ctx.fillText('Confidential', 10, 80);

      const watermark = document.createElement('div');
      watermark.style.position = 'absolute';
      watermark.style.top = '0';
      watermark.style.left = '0';
      watermark.style.width = '100%';
      watermark.style.height = '100%';
      watermark.style.pointerEvents = 'none';
      watermark.style.backgroundImage = `url(${canvas.toDataURL()})`;
      watermark.style.backgroundRepeat = 'repeat';
      watermark.style.zIndex = '9999';

      this.$refs.watermarkContainer.appendChild(watermark);
    }
  }
}
</script>

防止水印被删除

为防止用户通过开发者工具删除水印,可以采用MutationObserver监控DOM变化:

vue实现水印

methods: {
  observeWatermark() {
    const targetNode = this.$refs.watermarkContainer;
    const observer = new MutationObserver((mutations) => {
      mutations.forEach((mutation) => {
        if (!document.contains(watermark)) {
          targetNode.appendChild(watermark);
        }
      });
    });

    observer.observe(targetNode, {
      childList: true,
      subtree: true
    });

    this.$once('hook:beforeDestroy', () => {
      observer.disconnect();
    });
  }
}

动态水印内容

可将用户名等信息动态注入水印:

createWatermark() {
  const userInfo = this.$store.state.user.name;
  // ... canvas绘制时使用userInfo
}

服务端渲染水印

对于更安全的场景,可在服务端生成水印图片:

vue实现水印

// 伪代码示例
const serverWatermark = await axios.get('/api/watermark', {
  params: { text: userInfo }
});
watermark.style.backgroundImage = `url(${serverWatermark.data})`;

水印样式优化

调整水印视觉效果:

  • 降低透明度(opacity: 0.05-0.2)
  • 使用斜体或特殊字体
  • 增加文字间距
  • 使用多重水印层叠
.watermark {
  opacity: 0.1;
  font-style: italic;
  letter-spacing: 2px;
}

响应式水印

根据屏幕大小调整水印密度:

methods: {
  adjustWatermark() {
    const density = window.innerWidth < 768 ? 100 : 200;
    canvas.width = density;
    // ...重绘逻辑
  }
},
mounted() {
  window.addEventListener('resize', this.adjustWatermark);
}

标签: 水印vue
分享给朋友:

相关文章

vue实现过程

vue实现过程

Vue 的实现过程 Vue 的实现过程可以分为多个核心模块,包括响应式系统、虚拟 DOM、模板编译等。以下是 Vue 的主要实现过程分析。 响应式系统 Vue 的响应式系统基于 Object.def…

vue实现switch

vue实现switch

Vue 实现 Switch 开关组件 在 Vue 中实现 Switch 开关组件可以通过自定义组件或使用现有 UI 库完成。以下是几种常见实现方式: 自定义 Switch 组件 创建一个基础 Sw…

vue 实现拖动

vue 实现拖动

Vue 实现拖动的几种方法 在Vue中实现拖动功能可以通过多种方式,包括原生HTML5的拖放API、第三方库如vuedraggable等。以下是几种常见的实现方法: 使用HTML5拖放API HTM…

vue diff实现

vue diff实现

Vue Diff 算法实现原理 Vue 的虚拟 DOM Diff 算法(即 patch 过程)是其高效渲染的核心,主要通过对比新旧虚拟节点的差异,最小化 DOM 操作。以下是关键实现要点: 同层级比…

vue实现Siri

vue实现Siri

Vue 实现 Siri 风格语音交互 实现类似 Siri 的语音交互功能需要结合语音识别、语音合成和前端交互逻辑。Vue 作为前端框架,可以很好地管理这些功能的交互状态。 语音识别集成 使用 Web…

vue实现城市

vue实现城市

Vue 实现城市选择功能 使用 Element UI 的 Cascader 组件 Element UI 提供了一个 Cascader 级联选择器组件,非常适合实现城市选择功能。需要先安装 Elemen…