当前位置:首页 > VUE

vue实现水印

2026-01-12 22:09:22VUE

添加静态水印

在Vue中可以通过CSS或Canvas实现静态水印。CSS方式适合简单文字水印,Canvas适合复杂图形或自定义样式。

CSS方式
通过绝对定位和透明度控制,将水印覆盖在页面上:

vue实现水印

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

<style>
.watermark-container {
  position: relative;
}
.watermark {
  position: absolute;
  opacity: 0.5;
  font-size: 24px;
  color: #999;
  transform: rotate(-15deg);
  pointer-events: none; /* 防止水印拦截点击事件 */
  z-index: 9999;
}
</style>

Canvas方式
使用Canvas绘制水印并作为背景图,支持多行文字或复杂图案:

<template>
  <div :style="{ backgroundImage: `url(${watermarkDataUrl})` }"></div>
</template>

<script>
export default {
  data() {
    return {
      watermarkDataUrl: ''
    };
  },
  mounted() {
    this.generateWatermark();
  },
  methods: {
    generateWatermark() {
      const canvas = document.createElement('canvas');
      canvas.width = 300;
      canvas.height = 200;
      const ctx = canvas.getContext('2d');
      ctx.font = '16px Arial';
      ctx.fillStyle = 'rgba(200, 200, 200, 0.5)';
      ctx.rotate(-0.2);
      ctx.fillText('Confidential', 50, 100);
      this.watermarkDataUrl = canvas.toDataURL('image/png');
    }
  }
};
</script>

动态水印(防篡改)

为防止用户通过开发者工具删除水印,可结合MutationObserver监听DOM变化,自动重新插入水印。

vue实现水印

<template>
  <div ref="watermarkWrapper"></div>
</template>

<script>
export default {
  mounted() {
    this.initWatermark();
    this.observeWatermark();
  },
  methods: {
    initWatermark() {
      const watermark = document.createElement('div');
      watermark.className = 'dynamic-watermark';
      watermark.innerHTML = 'Dynamic Watermark';
      this.$refs.watermarkWrapper.appendChild(watermark);
    },
    observeWatermark() {
      const observer = new MutationObserver((mutations) => {
        mutations.forEach(() => {
          if (!document.querySelector('.dynamic-watermark')) {
            this.initWatermark();
          }
        });
      });
      observer.observe(this.$refs.watermarkWrapper, {
        childList: true,
        subtree: true
      });
    }
  }
};
</script>

全屏水印覆盖

适用于管理系统等需要全局水印的场景,通过Vue指令实现:

// 全局指令定义
Vue.directive('watermark', {
  inserted(el, binding) {
    const { text, fontSize, color } = binding.value || {};
    const canvas = document.createElement('canvas');
    canvas.width = 200;
    canvas.height = 150;
    const ctx = canvas.getContext('2d');
    ctx.font = `${fontSize || '14px'} Arial`;
    ctx.fillStyle = color || 'rgba(0, 0, 0, 0.1)';
    ctx.rotate(-0.3);
    ctx.fillText(text || 'Default Watermark', 10, 80);

    el.style.backgroundImage = `url(${canvas.toDataURL()})`;
    el.style.backgroundRepeat = 'repeat';
  }
});

// 使用方式
<template>
  <div v-watermark="{ text: 'Secret', fontSize: '18px', color: 'rgba(100, 100, 100, 0.2)' }"></div>
</template>

响应式水印调整

监听窗口变化时重新计算水印位置或密度:

export default {
  methods: {
    handleResize() {
      window.addEventListener('resize', this.debounce(() => {
        this.generateWatermark(); // 重新生成Canvas水印
      }, 200));
    },
    debounce(fn, delay) {
      let timer;
      return () => {
        clearTimeout(timer);
        timer = setTimeout(fn, delay);
      };
    }
  }
};

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

相关文章

vue组件的实现

vue组件的实现

Vue 组件的实现方式 Vue 组件可以通过多种方式实现,以下是常见的几种方法: 单文件组件 (SFC) 使用 .vue 文件,包含模板、脚本和样式三部分: <template>…

vue实现图片搜索

vue实现图片搜索

Vue实现图片搜索功能 使用HTML5的File API获取图片 通过<input type="file">元素让用户选择图片文件,使用FileReader对象读取图片数据。 <…

vue循环数组实现

vue循环数组实现

vue循环数组的实现方法 在Vue中循环数组主要通过v-for指令实现,以下是几种常见用法: 基本数组循环 使用v-for指令遍历数组,可以通过(item, index)的语法获取当前项和索引值:…

vue实现屏幕共享

vue实现屏幕共享

Vue 实现屏幕共享的方法 使用 WebRTC 和 getDisplayMedia API 通过 navigator.mediaDevices.getDisplayMedia 捕获屏幕内容,结合 We…

vue实现添加用户

vue实现添加用户

Vue 实现添加用户功能 数据绑定与表单设计 在 Vue 中实现添加用户功能,首先需要设计一个表单,用于收集用户输入的数据。通过 v-model 实现双向数据绑定,确保表单数据与 Vue 实例中的数据…

vue 页签实现

vue 页签实现

Vue 页签实现方法 在 Vue 中实现页签功能通常涉及动态组件、路由或状态管理。以下是几种常见的实现方式: 使用动态组件 通过 Vue 的 <component> 动态组件结合 v-…