当前位置:首页 > VUE

vue实现水印

2026-01-12 22:09:22VUE

添加静态水印

在Vue中可以通过CSS或Canvas实现静态水印。CSS方式适合简单文字水印,Canvas适合复杂图形或自定义样式。

CSS方式
通过绝对定位和透明度控制,将水印覆盖在页面上:

<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变化,自动重新插入水印。

<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 实现视频开场动画 在 Vue 中实现视频开场动画可以通过结合 HTML5 的 <video> 标签和 Vue 的过渡效果或生命周期钩子来完成。以下是具体实现方法: 安装依…

vue实现年历

vue实现年历

Vue 实现年历的方法 使用 Vue 实现年历可以通过组件化开发方式,结合日期计算和动态渲染完成。以下是两种常见的实现方式: 基于原生 Vue 的日历组件 创建 Calendar.vue 组件文件,…

vue为啥能实现监听

vue为啥能实现监听

Vue 实现监听的原理 Vue 的监听能力主要基于其响应式系统,该系统通过数据劫持和依赖收集实现。当数据变化时,系统能自动触发视图更新或执行回调函数。 核心机制:Object.definePrope…

vue实现文字播放栏

vue实现文字播放栏

Vue 实现文字播放栏(跑马灯效果) 方法一:使用 CSS 动画 + Vue 数据绑定 通过 CSS 的 @keyframes 实现动画效果,结合 Vue 的动态数据绑定控制内容。 <tem…

vue怎么实现文件树

vue怎么实现文件树

Vue 实现文件树的方法 使用递归组件 递归组件是处理嵌套数据结构的理想方式。文件树通常包含文件夹和文件的嵌套结构,适合用递归组件实现。 <template> <ul>…

vue实现无线滚动列表

vue实现无线滚动列表

无限滚动列表的实现方法 在Vue中实现无限滚动列表通常结合监听滚动事件和动态加载数据。以下是几种常见方法: 使用自定义指令 创建自定义指令v-infinite-scroll监听滚动事件: Vu…