uniapp加水印

<watermark text="仅供演示,不为真实" color="rgba(0, 0, 0, 0.15)" :fontSize="24" :rotateAngle="-45" :gapX="170" :gapY="200">

</watermark>

export default 下加:

components: {

watermark

},

import watermark from '@/components/watermark.vue'

watermark.vue文件在components里

复制代码
<template>
	    <view class="watermark-container">
		        <!-- 水印层 -->
		        <view class="watermark-layer">
			            <view class="watermark-grid">
				                <view class="watermark-item" v-for="(item, index) in watermarkList" :key="index"
					 :style="{
                          left: item.left + 'px',
                          top: item.top + 'px'
                      }">
					                    <text class="watermark-text" :style="{                         color: color,    
						                    fontSize: fontSize + 'px' ,                         transform:
						`rotate(${rotateAngle}deg)`                     }">{{ text }}</text>
					                </view>
				            </view>
			        </view>

		        <!-- 内容层 -->
		        <view class="watermark-content">
			            <slot></slot>
			        </view>
		    </view>
</template>

<script>
	export default {
		name: "watermark",
		props: {
			// 水印文字内容
			text: {
				type: String,
				default: '内部资料'
			},
			// 水印文字颜色
			color: {
				type: String,
				default: 'rgba(0, 0, 0, 0.1)'
			},
			// 水印文字大小
			fontSize: {
				type: Number,
				default: 16
			},
			// 水印旋转角度
			rotateAngle: {
				type: Number,
				default: -30
			},
			// 水印水平间距 (密度)
			gapX: {
				type: Number,
				default: 200
			},
			// 水印垂直间距 (密度)
			gapY: {
				type: Number,
				default: 200
			}
		},
		data() {
			return {
				watermarkList: []
			};
		},
		mounted() {
			this.generateWatermark();
		},
		methods: {
			generateWatermark() {
				// 计算需要多少个水印来覆盖屏幕
				const systemInfo = uni.getSystemInfoSync();
				const screenWidth = systemInfo.windowWidth || systemInfo.screenWidth;
				const screenHeight = systemInfo.windowHeight || systemInfo.screenHeight;

				const cols = Math.ceil(screenWidth / this.gapX) + 2; // 多加几列确保覆盖
				const rows = Math.ceil(screenHeight / this.gapY) + 2; // 多加几行确保覆盖

				const watermarkList = [];
				for (let i = 0; i < cols; i++) {
					for (let j = 0; j < rows; j++) {
						watermarkList.push({
							left: i * this.gapX,
							top: j * this.gapY
						});
					}
				}

				this.watermarkList = watermarkList;
			}
		}
	}
</script>

<style lang="scss" scoped>
	.watermark-container {
	position:
	relative;
	width: 100%;
	min-height: 100vh;
	overflow:
	hidden;
	}
	.watermark-layer {
	position:
	fixed;
	top: 0;
	left: 0;
	right: 0;
	bottom: 0;
	z-index: 9999;
	pointer-events:
	none;
	overflow:
	hidden;
	}
	.watermark-grid {
	width: 100%;
	height: 100%;
	}
	.watermark-item {
	position:
	absolute;
	display:
	flex;
	justify-content:
	center;
	align-items:
	center;
	}
	.watermark-text {
	white-space:
	nowrap;
	user-select:
	none;
	display:
	block;
	}
	.watermark-content {
	position:
	relative;
	z-index: 1;
	width: 100%;
	height: 100%;
	background-color:
	transparent;
	}
</style>
相关推荐
腻害兔2 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
不好听6132 小时前
从一行 JSX 到屏幕像素:前端开发者必须懂的浏览器渲染管线
前端
恒拓高科WorkPlus2 小时前
企业级内网即时通讯建设模型:BeeWorks内网IM四层架构
前端
码智社3 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
前端小李子3 小时前
前端环境变量裸奔?我用 EnvShield 给它穿了件防弹衣
前端
youtootech3 小时前
HarmonyOS《柚兔学伴》项目实战25-我的页面、Web 嵌入与项目总结
前端·华为·harmonyos
小林ixn4 小时前
从零到一理解 React 父子组件通信:手写一个 Todo 应用带你彻底搞懂单向数据流
前端·javascript·react.js
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
三声三视4 小时前
uni-app 鸿蒙端传参变成 [object Object]?顺着源码追到 ArkTS router 底层才搞明白
人工智能·ai·uni-app·aigc·ai编程·harmonyos
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎