当前位置:首页 > VUE

vue实现列表水印

2026-02-25 16:15:16VUE

添加背景水印

在Vue中实现列表水印可以通过CSS背景图方式实现。创建一个包含水印文本的Canvas,将其转为Base64格式作为背景图。

// 水印生成工具函数
function generateWatermark(text) {
  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(-20 * Math.PI / 180)
  ctx.fillText(text, 30, 80)
  return canvas.toDataURL('image/png')
}

组件实现

在Vue组件中使用计算属性动态生成水印样式,并应用到列表容器上。

vue实现列表水印

<template>
  <div class="list-container" :style="watermarkStyle">
    <div v-for="item in list" :key="item.id" class="list-item">
      {{ item.content }}
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      list: [
        { id: 1, content: 'Item 1' },
        { id: 2, content: 'Item 2' }
      ],
      watermarkText: 'CONFIDENTIAL'
    }
  },
  computed: {
    watermarkStyle() {
      return {
        backgroundImage: `url(${generateWatermark(this.watermarkText)})`,
        backgroundRepeat: 'repeat'
      }
    }
  }
}
</script>

<style>
.list-container {
  padding: 20px;
  min-height: 500px;
}
.list-item {
  padding: 10px;
  border-bottom: 1px solid #eee;
}
</style>

DOM水印覆盖方案

对于需要防止删除的水印,可以使用绝对定位的DOM元素覆盖整个列表区域。

vue实现列表水印

<template>
  <div class="list-wrapper">
    <div class="list-container">
      <!-- 列表内容 -->
    </div>
    <div class="watermark-overlay" v-html="watermarkHtml"></div>
  </div>
</template>

<script>
export default {
  computed: {
    watermarkHtml() {
      const text = this.watermarkText
      return `
        <div style="
          position: absolute;
          width: 100%;
          height: 100%;
          pointer-events: none;
          background-repeat: repeat;
          background-image: url(${generateWatermark(text)});
        "></div>
      `
    }
  }
}
</script>

<style>
.list-wrapper {
  position: relative;
}
.watermark-overlay {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  pointer-events: none;
  z-index: 999;
}
</style>

防止水印被移除

增加MutationObserver监控水印DOM变化,防止被恶意移除。

mounted() {
  this.protectWatermark()
},
methods: {
  protectWatermark() {
    const observer = new MutationObserver((mutations) => {
      mutations.forEach((mutation) => {
        if (!document.querySelector('.watermark-overlay')) {
          this.$nextTick(() => {
            const wrapper = document.querySelector('.list-wrapper')
            const overlay = document.createElement('div')
            overlay.className = 'watermark-overlay'
            overlay.innerHTML = this.watermarkHtml
            wrapper.appendChild(overlay)
          })
        }
      })
    })

    observer.observe(document.body, {
      childList: true,
      subtree: true
    })
  }
}

响应式水印调整

监听窗口大小变化,调整水印密度和大小。

data() {
  return {
    watermarkDensity: 3 // 每行水印数量
  }
},
created() {
  window.addEventListener('resize', this.adjustWatermark)
},
beforeDestroy() {
  window.removeEventListener('resize', this.adjustWatermark)
},
methods: {
  adjustWatermark() {
    const width = window.innerWidth
    this.watermarkDensity = Math.max(2, Math.floor(width / 300))
  }
}

标签: 水印列表
分享给朋友:

相关文章

vue实现列表循环

vue实现列表循环

Vue 列表循环的实现方法 在 Vue 中,可以通过 v-for 指令实现列表循环渲染。以下是几种常见的实现方式: 基础列表渲染 <template> <ul>…

vue实现虚拟列表

vue实现虚拟列表

虚拟列表的概念 虚拟列表(Virtual List)是一种优化长列表渲染性能的技术,通过仅渲染可视区域内的元素,减少DOM节点数量,从而提升页面性能。适用于数据量大的场景(如表格、下拉选择器等)。…

vue实现产品列表

vue实现产品列表

Vue 实现产品列表的方法 使用 Vue CLI 创建项目 安装 Vue CLI 并初始化项目,确保项目环境配置正确。 npm install -g @vue/cli vue create prod…

vue实现滚动列表

vue实现滚动列表

Vue 实现滚动列表的方法 使用 CSS 实现基础滚动 通过 CSS 的 overflow 属性可以快速实现滚动效果。适用于静态列表或简单动态内容。 <template> <d…

vue如何实现列表

vue如何实现列表

使用 v-for 指令渲染列表 在 Vue 中,可以通过 v-for 指令动态渲染列表数据。v-for 需要特殊的语法形式 item in items,其中 items 是源数据数组,item 是数组…

vue实现列表菜单

vue实现列表菜单

实现列表菜单的基本结构 在 Vue 中实现列表菜单通常使用 v-for 指令动态渲染菜单项。定义一个数组存储菜单数据,通过 v-for 遍历数组生成菜单项。 <template> &…