当前位置:首页 > 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 实现父子组件传值 父组件向子组件传值(props) 父组件通过 v-bind 或简写 : 向子组件传递数据。子组件通过 props 接收数据。 父组件代码: <template&g…

vue实现星星

vue实现星星

实现星星评分的Vue组件 使用Vue实现星星评分功能可以通过组件化方式完成,以下是一个完整的实现方案: 模板部分 <template> <div class="star-…

js实现vue

js实现vue

Vue.js 的基本实现方法 在 JavaScript 中实现 Vue.js 的功能,可以通过直接引入 Vue 库或使用现代构建工具(如 Vite 或 Webpack)。以下是几种常见的实现方式:…

vue实现前端

vue实现前端

Vue 实现前端的核心方法与步骤 安装 Vue 项目 使用 Vue CLI 或 Vite 创建项目。Vue CLI 是传统构建工具,Vite 是新一代轻量级工具。 npm init vue@l…

vue实现购票

vue实现购票

Vue 实现购票功能 数据结构设计 购票功能通常需要以下数据结构: 场次信息(时间、地点、价格) 座位信息(可选座位、已售座位) 用户订单信息 示例数据结构: data() { return…

vue实现网站

vue实现网站

Vue 实现网站的基本步骤 Vue.js 是一个渐进式 JavaScript 框架,适合构建现代化的单页应用(SPA)或动态网站。以下是使用 Vue 实现网站的基本方法。 初始化 Vue 项目 使…