&…">
当前位置:首页 > 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绘制逻辑实现多行文本水印。

vue实现水印效果

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.js 可以通过多种方式实现框架效果,包括使用内置指令、组件封装或第三方库。以下是几种常见的方法: 使用 Vue 指令实现基础框架效果 通过 Vue 的 v-if、…

vue实现定位效果

vue实现定位效果

使用Geolocation API实现定位 在Vue中可以通过浏览器内置的Geolocation API获取用户位置信息。需要在组件的mounted钩子中调用相关方法: mounted() {…

vue实现网页水印

vue实现网页水印

添加静态水印 在Vue中可以通过CSS或Canvas实现静态水印。CSS方法适合简单文字水印,Canvas适合复杂水印效果。 <template> <div class="wa…

js实现滚动条效果

js实现滚动条效果

实现滚动条效果的方法 使用原生JavaScript实现滚动条 通过监听滚动事件,可以动态调整滚动条的位置和样式。以下是一个基础实现示例: // 获取DOM元素 const container = d…

jquery 效果

jquery 效果

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

h5所能实现的效果

h5所能实现的效果

H5能实现的效果 H5(HTML5)作为最新的HTML标准,具备强大的功能和丰富的API支持,能够实现多种现代Web应用效果。以下是H5的主要能力分类: 多媒体支持 H5原生支持音频和视频播放,无需…