+
80
-

vue如何实现一个防篡改的水印组件?

vue如何实现一个防篡改的水印组件?


网友回复

+
0
-

nodejs

<template>
  <div class="watermark-container">
    <canvas ref="watermarkCanvas" class="watermark-canvas"></canvas>
    <div class="content">
      <!-- 这里是您的页面内容 -->
      <slot></slot>
    </div>
  </div>
</template>

<script>
export default {
  mounted() {
    this.drawWatermark();
    window.addEventListener('scroll', this.drawWatermark);
    window.addEventListener('resize', this.drawWatermark);
  },
  beforeDestroy() {
    window.removeEventListener('scroll', this.drawWatermark);
    window.removeEventListener('resize', this.drawWatermark);
  },
  methods: {
    drawWatermark() {
      const canvas = this.$refs.watermarkCanvas;
      const context = canvas.getContext('2d');
      context.clearRect(0, 0, canvas.width, canvas.height);

      // 设置水印样式
      context.font = '20px Arial';
      context.fillStyle = 'rgba(0, 0, 0, 0.1)';
      context.rotate((-20 * Math.PI) / 180);

      const text = 'Your Watermark Text';

      // 在画布上绘制水印
      for (let i = 0; i < window.innerWidth; i += 200) {
        for (let j = 0; j < window.innerHeight; j += 100) {
          context.fillText(text, i, j);
        }
      }
    },
  },
};
</script>

<style>
.watermark-container {
  position: relative;
}

.watermark-canvas {
  position: absolute;
  top: 0;
  left: 0;
  pointer-events: none;
  z-index: 1000;
}

.content {
  position: relative;
  z-index: 1;
}
</style>

cdn

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
<script type="text/javascript" src="//repo.bfw.wiki/bfwrepo/js/vue@2.6.1-dev.js"></script>
</head>
<body>
  <div id="app">
    <watermark>
      <div>
        <!-- 这里是您的页面内容 -->
        <h1>Hello, World!</h1>
      </div>
    </watermark>
  </div>

  <script>
    // 定义水印组件
    Vue.component('watermark', {
      mounted() {
        this.drawWatermark();
        window.addEventListener('scroll', this.drawWatermark);
        window.addEventListener('resize', this.drawWatermark);
      },
      beforeDestroy() {
        window.removeEventListener('scroll', this.drawWatermark);
        window.removeEventListener('resize', this.drawWatermark);
      },
      methods: {
        drawWatermark() {
          const canvas = this.$refs.watermarkCanvas;
          const context = canvas.getContext('2d');
          context.clearRect(0, 0, canvas.width, canvas.height);

          // 设置水印样式
          context.font = '20px Arial';
          context.fillStyle = 'rgba(0, 0, 0, 0.1)';
          context.rotate((-20 * Math.PI) / 180);

          const text = 'Your Watermark Text';

          // 在画布上绘制水印
          for (let i = 0; i < window.innerWidth; i += 200) {
            for (let j = 0; j < window.innerHeight; j += 100) {
              context.fillText(text, i, j);
            }
          }
        },
      },
      template: `
        <div class="watermark-container">
          <canvas ref="watermarkCanvas" class="watermark-canvas"></canvas>
          <div class="content">
            <slot></slot>
          </div>
        </div>
      `
    });

    new Vue({
      el: '#app'
    });
  </script>

  <style>
    .watermark-container {
      position: relative;
    }

    .watermark-canvas {
      position: absolute;
      top: 0;
      left: 0;
      pointer-events: none;
      z-index: 1000;
    }

    .content {
      position: relative;
      z-index: 1;
    }
  </style>
</body>
</html>

我知道答案,我要回答