当前位置:首页 > VUE

vue2实现水印

2026-02-24 08:20:55VUE

Vue2 实现水印的方法

使用 canvas 生成水印

在 Vue2 中可以通过 canvas 动态生成水印背景图,并将其设置为页面或指定元素的背景。

// 在 methods 中定义生成水印的方法
generateWatermark(text, options = {}) {
  const canvas = document.createElement('canvas')
  const ctx = canvas.getContext('2d')

  // 设置 canvas 尺寸
  canvas.width = options.width || 300
  canvas.height = options.height || 200

  // 设置水印样式
  ctx.font = options.font || '16px Arial'
  ctx.fillStyle = options.color || 'rgba(180, 180, 180, 0.3)'
  ctx.textAlign = 'center'
  ctx.textBaseline = 'middle'

  // 旋转文字
  ctx.translate(canvas.width / 2, canvas.height / 2)
  ctx.rotate(options.rotate || -20 * Math.PI / 180)

  // 绘制水印文字
  ctx.fillText(text, 0, 0)

  return canvas.toDataURL('image/png')
}

将水印应用到元素

在 mounted 钩子中调用生成水印的方法,并将其设置为背景:

mounted() {
  const watermark = this.generateWatermark('保密资料', {
    width: 200,
    height: 150,
    color: 'rgba(150, 150, 150, 0.2)'
  })

  // 应用到整个页面
  document.body.style.backgroundImage = `url(${watermark})`
  document.body.style.backgroundRepeat = 'repeat'

  // 或者应用到特定元素
  // this.$refs.watermarkElement.style.backgroundImage = `url(${watermark})`
}

防止水印被删除

为了防止用户通过开发者工具删除水印,可以添加 MutationObserver 监听 DOM 变化:

protectWatermark() {
  const targetNode = document.body
  const config = { attributes: true, childList: true, subtree: true }

  const callback = function(mutationsList) {
    for(let mutation of mutationsList) {
      if (mutation.type === 'attributes' && 
          mutation.attributeName === 'style') {
        targetNode.style.backgroundImage = `url(${watermark})`
        targetNode.style.backgroundRepeat = 'repeat'
      }
    }
  }

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

作为指令实现

可以封装为 Vue 指令,方便全局使用:

// 注册全局指令
Vue.directive('watermark', {
  bind(el, binding) {
    const text = binding.value.text || '水印'
    const canvas = document.createElement('canvas')
    const ctx = canvas.getContext('2d')

    canvas.width = 200
    canvas.height = 150

    ctx.font = '16px Arial'
    ctx.fillStyle = 'rgba(180, 180, 180, 0.3)'
    ctx.textAlign = 'center'
    ctx.textBaseline = 'middle'
    ctx.rotate(-20 * Math.PI / 180)
    ctx.fillText(text, 100, 75)

    el.style.backgroundImage = `url(${canvas.toDataURL('image/png')})`
    el.style.backgroundRepeat = 'repeat'
  }
})

使用方式:

<div v-watermark="{ text: '内部资料' }"></div>

注意事项

  • 水印颜色建议使用半透明效果,避免影响内容阅读
  • 旋转角度可以增加去除水印的难度
  • 对于重要场景,建议配合后端也添加水印
  • 在移动端需要注意 canvas 的兼容性问题
  • 水印密度可以根据需要调整 canvas 尺寸和重复频率

以上方法可以根据实际需求进行调整,例如增加多行水印、动态水印内容等功能。

vue2实现水印

标签: 水印
分享给朋友:

相关文章

vue页面实现水印

vue页面实现水印

实现Vue页面水印的方法 使用CSS背景图实现水印 在Vue组件中通过CSS添加重复水印背景,适合静态水印。 <template> <div class="watermark-…

vue怎么实现页面水印

vue怎么实现页面水印

实现页面水印的方法 在Vue中实现页面水印可以通过以下几种方式完成,根据需求选择合适的方法。 使用Canvas生成水印 通过Canvas绘制水印文本或图片,并将其作为背景插入到页面中。 //…

vue实现视频去除水印

vue实现视频去除水印

去除视频水印的常见方法 去除视频水印可以通过多种技术手段实现,以下是一些常见的方法及其在Vue中的实现思路。 使用CSS覆盖水印 通过CSS定位覆盖水印区域,适用于水印位置固定的场景。在Vue中可以…

如何实现一个react水印组件

如何实现一个react水印组件

实现React水印组件的方法 使用Canvas绘制水印 通过Canvas动态生成水印图案,可以灵活控制水印的样式和位置。 import React, { useEffect, useRef…

css怎样制作水印

css怎样制作水印

使用伪元素添加水印 通过 ::after 或 ::before 伪元素在目标元素上叠加水印,适合局部区域水印: .watermark { position: relative; } .wate…

php水印实现

php水印实现

PHP 添加图片水印的方法 使用 imagecopy 或 imagecopymerge 函数在图片上叠加水印图片 $sourceImage = imagecreatefromjpeg('origi…