当前位置: 首页 > news >正文

防止攥改之水印功能组件

防止攥改之水印功能组件

  • 效果图
  • 逻辑代码

效果图

在这里插入图片描述

逻辑代码

<template><div class="containerBox" ref="parentRef" style="height: 300px;background-color: red;"><slot></slot></div>
</template><script setup lang="ts">
// import useWatermarkBg from './useWatermarkBg.js';
import { onMounted, ref, onUnmounted } from 'vue';
const parentRef: any = ref(null)
const props = defineProps({text: {type: String,required: true,default: 'watermark'},fontSize: {type: Number,default: 40},gap: {type: Number,default: 20},textColor:{type: String,required: false,default: 'rgba(0,0,0,0.3)'}
})
let div: any
// canvas画出水印
function useWatermarkBg() {const canvas = document.createElement('canvas')const devicePixelRatio = window.devicePixelRatio || 1const fontSize = props.fontSize * devicePixelRatio;const font = fontSize + 'px serif';const ctx: any = canvas.getContext('2d')// 获取文字高度ctx.font = font;const { width } = ctx.measureText(props.text)const canvasSize = Math.max(100, width) + props.gap * devicePixelRatiocanvas.width = canvasSizecanvas.height = canvasSizectx.translate(canvas.width / 2, canvas.height / 2)ctx.rotate((Math.PI / 180) * -45)ctx.fillStyle = props.textColorctx.font = fontctx.textAlign = 'center'ctx.textBaseline = 'middle'ctx.fillText(props.text, 0, 0)return {base64: canvas.toDataURL(),size: canvasSize / devicePixelRatio}
}
function resetWatermark() {if (!parentRef.value) {return}if (div) {div.remove()}const { base64, size } = useWatermarkBg()div = document.createElement('div')div.style.position = 'absolute'div.style.backgroundImage = `url(${base64})`div.style.backgroundSize = `${size}px ${size}px`div.style.backgroundRepeat = 'repeat'div.style.zIndex = '9999'div.style.inset = '0'parentRef.value.appendChild(div)
}
onMounted(resetWatermark)
// 监听元素变化
const ob = new MutationObserver(entries => {console.log(entries);for(const entry of entries){// removeNodes删除的元素,如果删除的元素是水印元素,则重新画一个for (const dom of entry.removedNodes) {if(dom ==div){resetWatermark()return}}if(entry.target == div){resetWatermark()return}}
})
onMounted(() => {ob.observe(parentRef.value, {childList: true, // 子节点subtree: true,  //子树attributes: true // 属性})
})
//组件卸载之后取消
onUnmounted(() => {ob.disconnect()
})
</script><style scoped lang="scss"></style>
http://www.lryc.cn/news/170486.html

相关文章:

  • iOS 17 适配 Xcode 15 问题
  • Element Plus 快速开始
  • 华为云云耀云服务器L实例评测|StackEdit中文版在线Markdown笔记工具
  • MyEclipse报错javax/persistence/EntityManagerFactory
  • 【MySQL进阶】SQL性能分析
  • 在SpringBoot项目中整合SpringSession,基于Redis实现对Session的管理和事件监听
  • 浅析vue中computed,method,watch,watchEffect的区别
  • activiti7的数据表和字段的解释
  • Java手写Trie树和Trie树应用拓展案例
  • alova.js快速入门教程
  • 获取IP地址-根据IP获取位置信息
  • Android13适配-Google官方照片视频选择器
  • 云计算的发展趋势和挑战
  • PyG-GAT-Cora(在Cora数据集上应用GAT做节点分类)
  • java专项练习(验证码)
  • MS1861 视频处理与显示控制器 HDMI转MIPI LVDS转MIPI带旋转功能 图像带缩放,旋转,锐化
  • 广州华锐互动:利用VR复原文化遗址,沉浸式体验历史文物古迹的魅力
  • 微信小程序——事件监听
  • View绘制流程的源码所得
  • 企业级数据仓库-理论知识
  • 解决flutter不识别yaml里面配置的git项目
  • rust结构体
  • Python - 小玩意 - 键盘记录器
  • msvcp71.dll丢失的解决方法分享,全面分析msvcp71.dll丢失原因
  • stm32----ADC模数转换
  • Unity SteamVR 开发教程:用摇杆/触摸板控制人物持续移动(2.x 以上版本)
  • 04条件构造器和常用接口
  • 什么是HTTP状态码?常见的HTTP状态码有哪些?
  • vue3的双向绑定原理分析
  • MySQL数据库时间计算的用法