当前位置:首页 > 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组件中使用计算属性动态生成水印样式,并应用到列表容器上。

<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元素覆盖整个列表区域。

<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
    })
  }
}

响应式水印调整

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

vue实现列表水印

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 指令,结合数组或对象进行渲染。以下是几种常见的实现方式: 基础列表渲染 通过 v-for 指令遍历数组,动态生成列表项。 &…

vue实现搜索列表

vue实现搜索列表

Vue 实现搜索列表功能 在 Vue 中实现搜索列表功能通常需要以下几个关键步骤: 数据绑定与列表渲染 使用 v-model 绑定搜索输入框,监听用户输入。通过 v-for 指令渲染过滤后的列表数据…

vue实现列表菜单

vue实现列表菜单

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

vue实现列表模糊检索

vue实现列表模糊检索

实现思路 在Vue中实现列表模糊检索通常涉及以下几个关键点:利用计算属性动态过滤列表、绑定输入框的输入事件、使用正则表达式或字符串方法进行模糊匹配。 基础实现步骤 创建Vue实例或组件,定义数据列表…

轮播列表vue怎么实现

轮播列表vue怎么实现

使用 Vue 实现轮播列表 基于 Swiper 插件实现 安装 Swiper 依赖: npm install swiper 引入 Swiper 和样式: import { Swiper, Swip…

vue实现可滑动列表

vue实现可滑动列表

实现可滑动列表的基本思路 在Vue中实现可滑动列表,通常需要结合CSS样式和JavaScript事件处理。常见的实现方式包括使用CSS的overflow属性、第三方库如better-scroll或vu…