vue2添加自定义水印,原生小程序添加水印

1.项目使用的是vue2和element框架,element框架没有提供自定义水印功能

2.实现功能:使用自定义指定全局实现了自定义水印,解决嵌套iframe双重水印问题

3.js代码实现,新建js文件,下面为完整代码

/*
 * @Author: renmingjie
 * @Date: 2024-09-05 14:09:45
 * @LastEditors: Do not edit
 * @LastEditTime: 2024-09-23 11:26:03
 * @Description: 
 * @FilePath: \yikatong-ui\src\utils\directive.js
 */
import Vue from 'vue'  

let watermarkDivCache = null;
let canvasCache = null;

Vue.directive('watermark', {
  // 绑定
  bind(el, binding) {
    el.style.position = 'relative';
    updateWatermark(el, binding.value || '');
  },
  // 更新
  update(el, binding) {
    updateWatermark(el, binding.value || '');
  }
});

// 更新水印的辅助函数
function updateWatermark(el, text) {
  const isInsideIframe = window !== window.parent;
  if (isInsideIframe) {
    return;
  }

  if (watermarkDivCache) {
    el.removeChild(watermarkDivCache);
  }

  const canvas = createWatermarkCanvas(text);
  canvasCache = canvas;

  watermarkDivCache = createWatermarkDiv(canvas);

  el.appendChild(watermarkDivCache);
}

// 创建水印 canvas
function createWatermarkCanvas(text) {
  const canvas = canvasCache || document.createElement('canvas');
  const ctx = canvas.getContext('2d');

  const canvasWidth = 300;
  const canvasHeight = 180;
  canvas.width = canvasWidth;
  canvas.height = canvasHeight;

  ctx.font = '14px Arial';
  ctx.fillStyle = 'rgba(180, 180, 180, 0.2)';
  ctx.textAlign = 'center';
  ctx.textBaseline = 'middle';

  const textWidth = ctx.measureText(text).width;
  const x = canvasWidth / 2;
  const y = canvasHeight / 2;

  ctx.clearRect(0, 0, canvasWidth, canvasHeight);
  ctx.save();
  ctx.translate(x, y);
  ctx.rotate(-Math.PI / 8);
  ctx.fillText(text, 0, 0);
  ctx.restore();

  return canvas;
}

// 创建水印 div
function createWatermarkDiv(canvas) {
  const div = watermarkDivCache || document.createElement('div');
  div.style.position = 'fixed';
  div.style.top = '0';
  div.style.left = '0';
  div.style.right = '0';
  div.style.bottom = '0';
  div.style.pointerEvents = 'none';
  div.style.background = `url('${canvas.toDataURL("image/png")}') left top repeat`;
  return div;
}

4.将上面js文件引入到main.js里

// 水印
import './utils/directive.js'

5.在想要使用的页面添加水印,我这边全局添加,所以在app.vue中使用v-watermark="text",text为自定义水印,可以根据自身需要来添加,如果某个角色或者账号不想要添加水印可以将水印置为空即可

<template>
  <div id="app" v-watermark="text">
    <router-view />
    <theme-picker />
  </div>
</template>

原生小程序通过css来实现添加水印功能,不能全局添加,需要一个个页面添加,稍微麻烦点,代码如下userName,phoneNumber为水印内容,自行更换

<!-- 水印 -->
<view style="position: fixed;width: 100vw; height: 100vh; pointer-events: none;transform: rotate(-10deg);">
    <view style="display: flex; flex-wrap: wrap;">
        <block wx:for="{{50}}" wx:key="index">
            <view style="color:gray; margin:30rpx; padding:20rpx; opacity: 0.1;">
                {{userName}} {{phoneNumber}}
            </view>
            <view style="color:gray; margin:30rpx; padding:20rpx; opacity: 0.1;">

            </view>
        </block>
    </view>

</view>

内部项目就不放效果图了,如有不足,还请留言!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值