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

给页面元素添加水印

关键步骤

  1. 初始化和配置
  • 组件接受一系列配置参数,如水印文本、字体、颜色、旋转角度等。
  • 这些参数用于控制水印的外观和位置。
  1. Canvas绘图
  • 创建一个隐藏的<canvas>元素。
  • 使用Canvas API绘制水印图案,根据配置参数设置文本内容、字体样式、颜色、透明度和旋转角度。
  • 将绘制好的图案转换为Data URL格式的图像。
  1. 应用水印
  • 将生成的Data URL图像作为背景图像应用到目标区域。
  • 使用CSS设置背景图像的位置、重复方式和透明度,以确保水印覆盖整个目标区域。

核心代码示例

以下是一个代码示例:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><style>.target {width: 100vw;height: 100vh;}</style>
</head>
<body><div> </div><script>
function createWatermark ({text = '水印', fontSize = 16, color = 'rgba(0, 0, 0, 0.1)', rotate = -30}) {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');const width = 200;const height = 200;canvas.width = width;canvas.height = height;ctx.clearRect(0, 0, width, height);ctx.font = `${fontSize}px Arial`;ctx.fillStyle = color;ctx.textAlign = 'center';ctx.textBaseline = 'middle';ctx.translate(width / 2, height / 2);ctx.rotate((Math.PI / 180) * rotate);ctx.fillText(text, 0, 0);const dataUrl = canvas.toDataURL('image/png');return dataUrl
}function setStyle(watermarkElement) {const dataUrl = createWatermark({});watermarkElement.style.backgroundImage = `url(${dataUrl})`;watermarkElement.style.backgroundRepeat = 'repeat';watermarkElement.style.width = '100vw';watermarkElement.style.height = '100vh';watermarkElement.style.position = 'absolute';watermarkElement.style.top = 0;watermarkElement.style.pointerEvents = 'none'watermarkElement.style.visibility = 'visible'watermarkElement.style.opacity = 1
}
const watermarkElement = document.createElement('div');
setStyle(watermarkElement)
document.body.appendChild(watermarkElement);const observer = new MutationObserver((mutations) => {mutations.forEach((mutation) => {if (mutation.type === 'childList' && !document.contains(watermarkElement)) {document.body.appendChild(watermarkElement); // 重新添加水印}if (mutation.type === 'attributes' && mutation.target === watermarkElement) {// 恢复水印属性setStyle(watermarkElement)}});
});observer.observe(document.body, {childList: true,attributes: true,subtree: true,
});</script>
</body>
</html>

在实现防篡改的水印组件时,可以使用 MutationObserver 监控 DOM 变化:
MutationObserver 可以监控 DOM 树的变化,包括节点的添加、删除和属性的变化。当检测到水印元素被修改或删除时,可以立即恢复或重新添加水印。

相关文章:

  • Tomcat调优参数
  • Linux系统如何通过编译方式安装python3.11.3
  • Java——接口
  • Vue 2与Vue 3的区别
  • java图书电子商务网站的设计与实现源码(springboot+vue+mysql)
  • vue3父组件使用ref获取子组件的属性和方法
  • java 拦截器-用户无操作超时退出利用Redis
  • 【智能算法应用】模拟退火算法求解多车型车辆路径问题HFVRP
  • 在CSDN上成长的感悟,你的粉丝长啥样?
  • DEM、DSM和DTM之间的区别及5米高程数据获取
  • DragonKnight CTF2024部分wp
  • 缓存归纳总结1
  • go语言泛型Generic最佳实践 --- slices包
  • Unity 代码实现Animator开始和结束播放动画回调
  • 代码审计--一道简单的文件包含题目的多种利用方式
  • [PHP内核探索]PHP中的哈希表
  • angular2开源库收集
  • CentOS7简单部署NFS
  • Dubbo 整合 Pinpoint 做分布式服务请求跟踪
  • Intervention/image 图片处理扩展包的安装和使用
  • isset在php5.6-和php7.0+的一些差异
  • JavaScript 是如何工作的:WebRTC 和对等网络的机制!
  • javascript从右向左截取指定位数字符的3种方法
  • JS数组方法汇总
  • js数组之filter
  • MySQL常见的两种存储引擎:MyISAM与InnoDB的爱恨情仇
  • Next.js之基础概念(二)
  • spring + angular 实现导出excel
  • Spring思维导图,让Spring不再难懂(mvc篇)
  • SpriteKit 技巧之添加背景图片
  • Swift 中的尾递归和蹦床
  • 大数据与云计算学习:数据分析(二)
  • 力扣(LeetCode)357
  • 马上搞懂 GeoJSON
  • 前端_面试
  • 前端每日实战:61# 视频演示如何用纯 CSS 创作一只咖啡壶
  • 深度学习中的信息论知识详解
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 我有几个粽子,和一个故事
  • 要让cordova项目适配iphoneX + ios11.4,总共要几步?三步
  • 7行Python代码的人脸识别
  • ![CDATA[ ]] 是什么东东
  • # Redis 入门到精通(七)-- redis 删除策略
  • #stm32整理(一)flash读写
  • (2024,Vision-LSTM,ViL,xLSTM,ViT,ViM,双向扫描)xLSTM 作为通用视觉骨干
  • (Redis使用系列) Springboot 在redis中使用BloomFilter布隆过滤器机制 六
  • (solr系列:一)使用tomcat部署solr服务
  • (vue)el-tabs选中最后一项后更新数据后无法展开
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (附源码)计算机毕业设计SSM疫情居家隔离服务系统
  • (收藏)Git和Repo扫盲——如何取得Android源代码
  • (太强大了) - Linux 性能监控、测试、优化工具
  • (转)【Hibernate总结系列】使用举例
  • (自用)网络编程