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

vue实现水印效果

2026-02-18 18:35:55VUE

基础水印实现

通过CSS和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>

动态水印组件

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

<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中实现拖拽效果可以通过原生HTML5的拖拽API或第三方库如vuedraggable来完成。以下是两种常见方法的详细说明。 使用HTML5拖拽API HTML5提供了…

js实现图片滚动效果

js实现图片滚动效果

使用CSS动画实现图片滚动 通过CSS的@keyframes和animation属性实现无缝滚动效果。将图片容器设置为横向排列,通过动画平移位置。 <style> .scroll-…

jquery 效果

jquery 效果

jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。jQuery 提供了丰富的效果(Effects)功能,可以轻松实现元素的动态显…

vue实现框架效果

vue实现框架效果

Vue实现框架效果的方法 使用Vue实现框架效果可以通过多种方式完成,包括使用Vue Router、动态组件或第三方UI库。以下是几种常见的方法: 使用Vue Router实现布局框架 Vue Ro…

vue实现突出效果

vue实现突出效果

Vue 实现突出效果的方法 在 Vue 中实现突出效果通常涉及动态样式绑定、动画过渡或第三方库的使用。以下是几种常见实现方式: 动态类名绑定 通过 v-bind:class 或简写 :class 实…

vue实现抽屉效果

vue实现抽屉效果

Vue 实现抽屉效果的方法 使用 Vue 过渡动画和 CSS 在 Vue 中可以通过 v-if 或 v-show 控制抽屉的显示隐藏,结合 <transition> 组件实现平滑动画效果。…