当前位置:首页 > VUE

vue 水印 实现

2026-02-10 16:39:52VUE

Vue 水印实现方法

使用 CSS 背景图实现

在 Vue 中可以通过 CSS 的 background-image 属性添加水印。创建一个包含水印文本的 Canvas 元素,将其转换为 Data URL 后设置为背景。

// 在 Vue 组件中
methods: {
  generateWatermark(text) {
    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.3)';
    ctx.rotate(-0.2);
    ctx.fillText(text, 10, 80);
    return canvas.toDataURL('image/png');
  }
},
mounted() {
  const watermark = this.generateWatermark('Confidential');
  document.body.style.backgroundImage = `url(${watermark})`;
  document.body.style.backgroundRepeat = 'repeat';
}

使用自定义指令实现

创建一个 Vue 自定义指令可以更灵活地控制水印的添加和移除。

// main.js 或单独的文件
Vue.directive('watermark', {
  inserted(el, binding) {
    const { text, color, fontSize } = binding.value || {};
    const canvas = document.createElement('canvas');
    canvas.width = 200;
    canvas.height = 150;
    const ctx = canvas.getContext('2d');
    ctx.font = `${fontSize || '16px'} Arial`;
    ctx.fillStyle = color || 'rgba(200, 200, 200, 0.3)';
    ctx.rotate(-0.2);
    ctx.fillText(text || 'Watermark', 10, 80);

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

// 在组件中使用
<template>
  <div v-watermark="{ text: 'Sample', color: 'rgba(0,0,0,0.1)', fontSize: '20px' }">
    <!-- 内容 -->
  </div>
</template>

使用第三方库

对于更复杂的水印需求,可以考虑使用专门的水印库如 vue-watermark

安装:

npm install vue-watermark

使用:

import VueWatermark from 'vue-watermark';

Vue.use(VueWatermark);

// 在组件中
<template>
  <vue-watermark
    :text="watermarkText"
    :font-size="16"
    :color="'rgba(0,0,0,0.1)'"
    :width="200"
    :height="150"
  >
    <!-- 内容 -->
  </vue-watermark>
</template>

防止水印被移除

为了防止用户通过开发者工具移除水印,可以结合 MutationObserver 监听 DOM 变化并重新添加水印。

vue 水印 实现

mounted() {
  const observer = new MutationObserver((mutations) => {
    mutations.forEach(() => {
      if (!document.body.getAttribute('data-watermark')) {
        this.addWatermark();
      }
    });
  });

  observer.observe(document.body, {
    attributes: true,
    childList: true,
    subtree: true
  });

  this.addWatermark();
},
methods: {
  addWatermark() {
    const watermark = this.generateWatermark('Protected');
    document.body.style.backgroundImage = `url(${watermark})`;
    document.body.setAttribute('data-watermark', 'true');
  }
}

这些方法提供了从简单到高级的不同水印实现方案,可以根据具体需求选择合适的实现方式。

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

相关文章

vue组件实现

vue组件实现

Vue 组件实现基础 Vue 组件是 Vue.js 的核心特性之一,允许将 UI 拆分为独立、可复用的模块。组件的实现包括定义、注册、数据传递和生命周期管理等。 定义组件 组件可以通过单文件组件(.…

vue实现主题

vue实现主题

Vue 实现主题的方法 使用 CSS 变量动态切换主题 定义全局 CSS 变量,通过修改这些变量实现主题切换。在 Vue 的根组件或全局样式中定义变量: :root { --primary-co…

vue实现app

vue实现app

Vue 实现 App 的常见方法 使用 Vue 开发移动端 App 主要有两种主流方案:混合开发(Hybrid)和原生渲染。以下是具体实现方式和工具链: 混合开发方案(WebView 嵌入) 通过…

vue 实现过滤

vue 实现过滤

Vue 实现过滤的方法 在 Vue 中实现过滤功能可以通过多种方式完成,包括使用计算属性、自定义过滤器、第三方库等。以下是几种常见的实现方法: 使用计算属性进行过滤 计算属性是 Vue 中最常用的过…

vue实现ajax

vue实现ajax

Vue 中实现 AJAX 的几种方法 在 Vue 中实现 AJAX 请求可以通过原生 JavaScript 的 XMLHttpRequest、第三方库如 axios 或 fetch API 来完成。以…

vue 实现全屏

vue 实现全屏

Vue 实现全屏功能 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 完成。以下是一个完整的实现方案: 安装依赖(可选) 如果需要跨浏览器兼容性更好,可以安装…