当前位置:首页 > 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
    })
  }
}

响应式水印调整

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

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实现列表水印

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

相关文章

uniapp商品列表

uniapp商品列表

商品列表实现方法 在uniapp中实现商品列表功能,可以通过多种方式完成,以下是几种常见的方法: 使用scroll-view组件实现滚动列表 <scroll-view scroll-y=…

vue实现水印组件

vue实现水印组件

Vue 水印组件的实现方法 使用Canvas绘制水印 在Vue组件中通过Canvas动态生成水印图案,将其作为背景添加到目标元素上。 <template> <div ref=…

vue实现文本列表

vue实现文本列表

Vue 实现文本列表的方法 Vue 可以通过多种方式实现文本列表的渲染和管理,以下是几种常见的方法: 使用 v-for 指令渲染列表 通过 v-for 指令可以动态渲染数组或对象中的文本列表。…

vue实现传输列表

vue实现传输列表

Vue 实现传输列表 在 Vue 中实现传输列表功能,通常涉及两个列表之间的数据传递,用户可以通过按钮或拖拽操作将项目从一个列表移动到另一个列表。以下是实现传输列表的几种方法。 使用组件间数据传递…

vue实现列表全选

vue实现列表全选

实现全选功能的基本思路 在Vue中实现列表全选功能,通常需要结合v-model和计算属性来管理选中状态。全选按钮的状态与列表中所有项的选中状态相互关联。 基础实现方法 准备一个数据列表和对应的选中状…

vue实现筛选列表

vue实现筛选列表

Vue 实现筛选列表的方法 数据绑定与列表渲染 使用 v-for 指令渲染原始列表,绑定到 data 中的数组。例如: data() { return { items: […