当前位置:首页 > VUE

vue实现水印效果

2026-03-10 07:50:28VUE

使用CSS背景图实现水印

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

<template>
  <div class="watermarked-container"></div>
</template>

<script>
export default {
  mounted() {
    this.setWatermark('机密文件', 'rgba(200,200,200,0.3)');
  },
  methods: {
    setWatermark(text, color) {
      const canvas = document.createElement('canvas');
      canvas.width = 300;
      canvas.height = 200;
      const ctx = canvas.getContext('2d');
      ctx.font = '20px Arial';
      ctx.fillStyle = color;
      ctx.rotate(-0.4);
      ctx.fillText(text, 50, 100);

      const container = document.querySelector('.watermarked-container');
      container.style.backgroundImage = `url(${canvas.toDataURL()})`;
      container.style.backgroundRepeat = 'repeat';
    }
  }
}
</script>

通过自定义指令实现全局水印

创建Vue自定义指令可以在多个组件中复用。指令会在元素上添加水印DOM节点。

vue实现水印效果

// main.js
Vue.directive('watermark', {
  inserted(el, binding) {
    const { text, color } = binding.value;
    const watermark = document.createElement('div');
    watermark.style.position = 'absolute';
    watermark.style.top = '0';
    watermark.style.left = '0';
    watermark.style.width = '100%';
    watermark.style.height = '100%';
    watermark.style.pointerEvents = 'none';
    watermark.style.backgroundImage = `url(${createWatermarkCanvas(text, color)})`;
    watermark.style.backgroundRepeat = 'repeat';

    el.style.position = 'relative';
    el.appendChild(watermark);
  }
});

function createWatermarkCanvas(text, color) {
  const canvas = document.createElement('canvas');
  canvas.width = 200;
  canvas.height = 150;
  const ctx = canvas.getContext('2d');
  ctx.font = '16px Arial';
  ctx.fillStyle = color || 'rgba(180,180,180,0.3)';
  ctx.rotate(-0.3);
  ctx.fillText(text, 30, 80);
  return canvas.toDataURL();
}

动态更新水印内容

结合Vue的响应式特性,可以通过watch监听水印内容变化。

vue实现水印效果

<template>
  <div v-watermark="watermarkConfig"></div>
</template>

<script>
export default {
  data() {
    return {
      watermarkConfig: {
        text: '初始水印',
        color: 'rgba(200,200,200,0.5)'
      }
    }
  },
  mounted() {
    setTimeout(() => {
      this.watermarkConfig = {
        text: '更新后的水印',
        color: 'rgba(150,150,150,0.7)'
      };
    }, 3000);
  }
}
</script>

防止水印被删除

通过MutationObserver监控水印DOM变化,防止用户通过开发者工具删除水印。

Vue.directive('watermark', {
  inserted(el, binding) {
    const observer = new MutationObserver((mutations) => {
      const watermarkExist = el.querySelector('.watermark');
      if (!watermarkExist) {
        createWatermark(el, binding.value);
      }
    });
    observer.observe(el, { childList: true });
    createWatermark(el, binding.value);
  }
});

function createWatermark(el, { text, color }) {
  // 创建水印元素的实现代码
}

使用SVG实现高清水印

SVG水印在Retina屏幕上显示更清晰,适合高分辨率场景。

function createSvgWatermark(text) {
  const svg = `
    <svg width="300" height="200" xmlns="http://www.w3.org/2000/svg">
      <text x="50" y="100" 
            font-family="Arial" 
            font-size="20" 
            fill="rgba(200,200,200,0.3)"
            transform="rotate(-30 100,100)">
        ${text}
      </text>
    </svg>`;
  return `data:image/svg+xml;base64,${btoa(svg)}`;
}

以上方法可以根据实际需求选择或组合使用,CSS背景图适合简单场景,自定义指令提供更好的复用性,MutationObserver增强安全性,SVG则提供更好的显示效果。

标签: 水印效果
分享给朋友:

相关文章

vue 水印 实现

vue 水印 实现

Vue 水印实现方法 使用 Canvas 绘制水印 在 Vue 中可以通过 Canvas 动态生成水印,并将其作为背景或覆盖层添加到页面中。 <template> <div c…

vue实现抽屉效果

vue实现抽屉效果

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

vue实现动画效果

vue实现动画效果

Vue 实现动画效果的方法 Vue 提供了多种方式来实现动画效果,包括内置的过渡系统、第三方动画库以及 CSS 动画。以下是几种常见的方法: 使用 Vue 内置的过渡系统 Vue 的 <tra…

vue实现弹窗效果

vue实现弹窗效果

使用 Vue 实现弹窗效果 组件化弹窗实现 创建独立的弹窗组件 Modal.vue,通过 v-if 或 v-show 控制显示状态: <template> <div class…

vue实现水印效果

vue实现水印效果

实现水印效果的几种方法 在Vue中实现水印效果可以通过多种方式,以下是几种常见的方法: 使用CSS背景图 通过CSS的background-image属性可以实现简单的水印效果。定义一个包含水印文本…

vue 实现拖动效果

vue 实现拖动效果

使用 Vue 实现拖动效果 Vue 提供了多种方式实现拖动效果,可以通过原生 HTML5 的拖放 API,也可以使用第三方库如 vuedraggable。以下是两种常见的方法: 使用 HTML5 拖…