当前位置:首页 > VUE

vue 水印 实现

2026-03-07 16:29:19VUE

Vue 水印实现方法

使用 canvas 生成水印

通过 canvas 绘制水印文字或图片,转换为 base64 图片后设置为背景。这种方法适用于需要动态生成水印的场景。

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

<script>
export default {
  mounted() {
    this.createWatermark()
  },
  methods: {
    createWatermark() {
      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.3)
      ctx.fillText('Confidential', 10, 80)

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

CSS 伪元素实现水印

对于简单的水印需求,可以使用 CSS 伪元素实现,性能更好但灵活性较低。

<template>
  <div class="watermarked-content">
    <!-- 页面内容 -->
  </div>
</template>

<style>
.watermarked-content {
  position: relative;
}

.watermarked-content::after {
  content: "Watermark Text";
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  bottom: 0;
  pointer-events: none;
  opacity: 0.2;
  font-size: 48px;
  color: #999;
  display: flex;
  align-items: center;
  justify-content: center;
  transform: rotate(-30deg);
  z-index: 9999;
}
</style>

使用第三方库

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

安装:

npm install vue-watermark

使用:

<template>
  <watermark
    :text="watermarkText"
    :fontSize="16"
    :opacity="0.3"
    :width="200"
    :height="150"
  >
    <!-- 需要加水印的内容 -->
  </watermark>
</template>

<script>
import Watermark from 'vue-watermark'

export default {
  components: {
    Watermark
  },
  data() {
    return {
      watermarkText: 'Confidential'
    }
  }
}
</script>

防止水印被移除

为防止用户通过开发者工具移除水印,可以结合 MutationObserver 监控 DOM 变化,自动重新添加被移除的水印。

vue 水印 实现

mounted() {
  this.createWatermark()
  this.protectWatermark()
},
methods: {
  protectWatermark() {
    const targetNode = document.querySelector('.watermark-container')
    const config = { attributes: true, childList: true, subtree: true }

    const callback = (mutationsList) => {
      for(let mutation of mutationsList) {
        if(mutation.type === 'childList' || 
           mutation.type === 'attributes') {
          this.createWatermark()
        }
      }
    }

    const observer = new MutationObserver(callback)
    observer.observe(targetNode, config)
  }
}

水印样式自定义建议

  • 透明度建议设置在 0.2-0.4 之间,既不影响内容阅读又能清晰显示
  • 旋转角度通常在 -15° 到 -45° 之间效果较好
  • 字体大小根据容器尺寸调整,一般 16px-24px
  • 颜色推荐使用灰色系,如 #999 或 rgba(150,150,150,0.3)
  • 水印密度根据需求调整,可以适当增加重复间距

以上方法可以根据实际项目需求选择或组合使用,canvas 方法灵活性最高,CSS 方法性能最好,第三方库则提供了开箱即用的解决方案。

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

相关文章

vue实现查询替换

vue实现查询替换

Vue 实现查询替换功能 在 Vue 中实现查询替换功能,可以通过数据绑定和字符串操作方法结合实现。以下是具体实现方式: 基础实现 <template> <div>…

vue实现按卡片轮播

vue实现按卡片轮播

实现卡片轮播的基本思路 在Vue中实现卡片轮播可以通过结合v-for指令和动态样式绑定完成。核心是维护一个当前显示卡片的索引,通过CSS过渡效果实现平滑切换。 基础实现步骤 模板部分 使用v-for…

vue实现全局遮罩层

vue实现全局遮罩层

实现全局遮罩层的方法 在Vue中实现全局遮罩层可以通过多种方式完成,以下是几种常见的实现方法: 使用Vue组件创建遮罩层 创建一个遮罩层组件,通过全局注册或动态挂载的方式实现全局调用。以下是一个简单…

vue实现继承语法糖

vue实现继承语法糖

在Vue中实现继承可以通过多种方式模拟类继承的效果,以下是常见的几种方法: 使用mixins实现逻辑复用 通过Vue的mixins机制共享组件选项,达到类似继承的效果: const BaseCom…

vue实现下拉框删除

vue实现下拉框删除

Vue 实现下拉框删除功能 在Vue中实现下拉框的删除功能通常涉及以下步骤: 数据绑定与渲染 在Vue组件中定义数据数组用于存储下拉框选项: data() { return { op…

vue实现图库

vue实现图库

Vue 实现图库的基本方法 使用 Vue 实现图库功能可以通过多种方式完成,以下是一些常见的方法和实现步骤。 使用 Vue 和第三方库(如 Vue Gallery) 安装 vue-gallery 或…