当前位置:首页 > 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 的核心功能包括数据响应式、模板编译和虚拟 DOM。以下是一个简易实现方案,涵盖核心功能模块。 数据响应式系统 通过 Object.defineProperty…

vue实现switch

vue实现switch

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

vue实现单据

vue实现单据

Vue 实现单据功能的方法 使用 Vue 实现单据功能通常涉及表单设计、数据绑定、验证和提交等环节。以下是具体实现方案: 表单设计与数据绑定 使用 Vue 的 v-model 指令实现表单数据的双向…

vue mvvm实现

vue mvvm实现

Vue MVVM 实现原理 Vue.js 是一个基于 MVVM(Model-View-ViewModel)模式的框架,其核心是通过数据绑定和响应式系统实现视图与数据的自动同步。以下是 Vue 实现 M…

vue搜索实现

vue搜索实现

Vue 搜索功能实现方法 基于计算属性的搜索 在 Vue 中可以通过计算属性实现简单的搜索功能。这种方式适合小型数据集,利用 JavaScript 的 filter 方法进行筛选。 data() {…

vue实现阻塞

vue实现阻塞

Vue 实现阻塞的方法 在 Vue 中实现阻塞操作通常涉及异步控制、状态管理或生命周期钩子的使用。以下是几种常见方法: 使用 async/await 处理异步阻塞 通过 async/await 可…