…">
当前位置:首页 > VUE

vue实现水印效果

2026-02-18 18:35:55VUE

基础水印实现

通过CSS和Vue动态生成水印背景,适合简单场景。

vue实现水印效果

<template>
  <div class="watermark-container">
    <!-- 内容区域 -->
    <slot></slot>
  </div>
</template>

<script>
export default {
  mounted() {
    this.createWatermark('机密', 30, -15);
  },
  methods: {
    createWatermark(text, angle = 30, offset = -15) {
      const container = document.querySelector('.watermark-container');
      const canvas = document.createElement('canvas');
      canvas.width = 200;
      canvas.height = 150;
      const ctx = canvas.getContext('2d');

      ctx.font = '16px Arial';
      ctx.fillStyle = 'rgba(200, 200, 200, 0.2)';
      ctx.rotate((Math.PI / 180) * angle);
      ctx.fillText(text, offset, 80);

      container.style.backgroundImage = `url(${canvas.toDataURL()})`;
    }
  }
};
</script>

<style>
.watermark-container {
  position: relative;
  width: 100%;
  min-height: 100vh;
  background-repeat: repeat;
}
</style>

动态水印组件

封装可复用的水印组件,支持动态更新内容。

vue实现水印效果

<template>
  <div ref="watermarkEl" class="watermark-wrapper">
    <slot></slot>
  </div>
</template>

<script>
export default {
  props: {
    text: { type: String, default: 'Watermark' },
    opacity: { type: Number, default: 0.1 },
    fontSize: { type: Number, default: 16 }
  },
  watch: {
    text() { this.updateWatermark(); },
    opacity() { this.updateWatermark(); }
  },
  mounted() { this.updateWatermark(); },
  methods: {
    updateWatermark() {
      const el = this.$refs.watermarkEl;
      const canvas = document.createElement('canvas');
      canvas.width = 300;
      canvas.height = 200;
      const ctx = canvas.getContext('2d');

      ctx.font = `${this.fontSize}px sans-serif`;
      ctx.fillStyle = `rgba(0, 0, 0, ${this.opacity})`;
      ctx.rotate(-0.4);
      ctx.fillText(this.text, 20, 100);

      el.style.backgroundImage = `url(${canvas.toDataURL()})`;
    }
  }
};
</script>

防篡改水印方案

通过MutationObserver监测DOM修改,防止水印被删除。

// 在基础水印实现中增加以下代码
mounted() {
  this.createWatermark();
  this.observeWatermark();
},
methods: {
  observeWatermark() {
    const targetNode = document.querySelector('.watermark-container');
    const observer = new MutationObserver((mutations) => {
      mutations.forEach(() => {
        if (!targetNode.style.backgroundImage.includes('data:image/png')) {
          this.createWatermark();
        }
      });
    });
    observer.observe(targetNode, { attributes: true });
  }
}

多行水印生成

扩展canvas绘制逻辑实现多行文本水印。

createMultiLineWatermark(lines) {
  const canvas = document.createElement('canvas');
  canvas.width = 400;
  canvas.height = 300;
  const ctx = canvas.getContext('2d');

  ctx.font = '14px Arial';
  ctx.fillStyle = 'rgba(120, 120, 120, 0.1)';
  ctx.rotate(-0.3);

  lines.forEach((line, index) => {
    ctx.fillText(line, 10, 50 + (index * 30));
  });

  this.$refs.container.style.backgroundImage = `url(${canvas.toDataURL()})`;
}

注意事项

  • 使用CSS的pointer-events: none避免水印影响交互
  • 对于重要场景建议结合后端生成水印图片
  • 高频更新的内容需考虑性能优化(如防抖)

标签: 水印效果
分享给朋友:

相关文章

vue实现突出效果

vue实现突出效果

Vue 实现突出效果的方法 在 Vue 中实现突出效果可以通过多种方式,包括动态样式绑定、过渡动画、第三方库等。以下是几种常见的方法: 动态样式绑定 通过 v-bind:class 或 v-bind…

vue实现基金效果

vue实现基金效果

Vue 实现基金效果 在 Vue 中实现基金效果,通常指的是模拟基金的增长、波动或可视化展示。以下是几种常见的实现方式: 数据绑定与动态更新 通过 Vue 的数据绑定特性,可以动态展示基金净值的变化…

vue实现检索效果

vue实现检索效果

Vue实现检索功能的方法 在Vue中实现检索功能通常需要结合数据绑定、计算属性和方法。以下是几种常见的实现方式: 基础实现(基于计算属性) <template> <div>…

vue 实现toogle效果

vue 实现toogle效果

使用 v-if 和 v-else 实现切换 通过 Vue 的指令 v-if 和 v-else 可以轻松实现元素的显示与隐藏切换。 <template> <button @c…

vue如何实现浮动效果

vue如何实现浮动效果

实现浮动效果的方法 在Vue中实现浮动效果,可以通过CSS的float属性或结合定位属性(如position: fixed)来实现。以下是几种常见场景的实现方式: 使用CSS float属性 通过为…

vue实现翻页动画效果

vue实现翻页动画效果

Vue 实现翻页动画效果的方法 使用 CSS Transition 和 Vue 过渡 在 Vue 中可以通过 <transition> 组件结合 CSS 实现翻页动画效果。定义一个过渡类名…