当前位置:首页 > 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节点。

// 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监听水印内容变化。

<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屏幕上显示更清晰,适合高分辨率场景。

vue实现水印效果

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 实现效果更新的方法 Vue 提供了多种方式实现动态效果更新,主要依赖其响应式系统和生命周期钩子。以下是几种常见的方法: 数据绑定与响应式更新 Vue 的核心是数据驱动视图。通过修改数据,视图…

vue实现抽屉效果

vue实现抽屉效果

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

vue实现过度效果

vue实现过度效果

Vue 过渡效果实现方法 Vue 提供了内置的 <transition> 和 <transition-group> 组件,用于在元素或组件进入/离开 DOM 时应用过渡效果。…

vue 实现滑动效果

vue 实现滑动效果

Vue 实现滑动效果的方法 使用 CSS Transition 通过 Vue 的 v-if 或 v-show 结合 CSS Transition 实现滑动效果。定义一个 CSS 类,利用 transf…

vue实现菜单效果

vue实现菜单效果

Vue实现菜单效果的方法 基础菜单实现 使用Vue的v-for指令和v-show/v-if可以快速实现基础菜单。通过数据驱动的方式渲染菜单项,结合事件处理实现交互。 <template>…

vue实现taggle效果

vue实现taggle效果

Vue实现Toggle效果 在Vue中实现Toggle效果可以通过多种方式完成,以下是几种常见的方法: 方法1:使用v-model和v-show/v-if 通过v-model绑定一个布尔值,结合v…