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

前端:前端开发中,实现水印(Watermark)

一、理解水印

在前端开发中,实现水印(Watermark)通常是为了在页面上显示半透明的文字或图案,以标识版权、归属或防止内容被非法使用。

二、水印(Watermark)的原理

水印并未真正与页面内容物理混合(如图片像素合并),而是通过视觉叠加内容覆盖的方式,在用户感知层面实现与页面内容的共存。其核心是利用透明度、定位和重复图案,让水印在不影响主要内容阅读的同时,达到标识或防篡改的目的。

三、实现

3.1、使用 CSS + 绝对定位的 DOM 元素

.watermark-container {position: relative;
}.watermark {position: absolute;top: 0;left: 0;width: 100%;height: 100%;pointer-events: none; /* 允许点击穿透水印 */background: url("data:image/...");z-index: 9999;
}

3.2、使用 Canvas 动态生成水印

function setWatermark(text) {const canvas = document.createElement('canvas');canvas.width = 200;canvas.height = 150;const ctx = canvas.getContext('2d');ctx.rotate((-20 * Math.PI) / 180); // 旋转文字ctx.font = '16px Arial';ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';ctx.textAlign = 'center';ctx.textBaseline = 'middle';ctx.fillText(text, canvas.width / 2, canvas.height / 2);// 将 Canvas 作为背景图应用document.body.style.backgroundImage = `url(${canvas.toDataURL()})`;
}setWatermark('公司机密');

3.3、使用 CSS ::after 伪元素

body::after {content: '机密文件';position: fixed;bottom: 50%;right: 50%;transform: translate(50%, 50%) rotate(-45deg);opacity: 0.2;font-size: 24px;pointer-events: none;
}

四、MutationObserver 防篡改

// 监听 DOM 变化,防止水印被删除
function protectWatermark(selector) {const observer = new MutationObserver((mutations) => {mutations.forEach((mutation) => {if (mutation.removedNodes) {const removed = Array.from(mutation.removedNodes);if (removed.some(node => node.matches?.(selector))) {// 重新添加水印setWatermark('机密文件');}}});});observer.observe(document.body, { childList: true, subtree: true });
}// 调用保护函数
protectWatermark('.watermark');

五、欢迎交流指正

http://www.dtcms.com/a/540482.html

相关文章:

  • 网站排名方法胶州网站建设 网络推广
  • 潍坊商城网站建设修改wordpress样式
  • AI智能体从系统智能到生态智能:SmartMediaKit 如何成为智能体时代的视频神经系统
  • 【音视频】H.264关键帧识别
  • AI智能相机未来应用
  • grafana做状态变化的监控图表
  • 19.高级的ACL
  • 网站推广广告营销方案海南省建设培训网站报名
  • Excel怎么根据居民身份证号码获取性别?
  • 张家港网站设计织梦网站文章发布模板下载
  • 在Ubuntu通过命令行安装MySQL(tabby远程)
  • 【JavaEE初阶】网络原理——TCP核心机制2 超时重传
  • 电科金仓推动浙人医信创发展:多院区异构数据库架构的创新解决方案
  • 【JavaEE初阶】TCP核心机制3——连接管理
  • 找工作在什么网站找比较好南京市浦口区城乡建设局网站
  • Matter协议,如何塑造更宜居、流畅的智能家居网络?
  • git config --global user.name
  • 如何为直播视频APP选择合适的高防产品
  • 探索Perplexity:当AI遇上搜索引擎的革命性突破
  • macOS 部署安装 IndexTTS2
  • 缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
  • 【软件架构】数据库系统与缓存设计:五种缓存一致性方案
  • 什么样的网站是一个成功的网站如何介绍网站模板
  • 广西网站建设推广报价wordpress纯图片主题
  • 数据库中的约束
  • BFS(广度优先搜索)算法和a*算法详解和对比
  • leetcode 3354. 使数组元素等于零 简单
  • 前端Word文件在线预览-文件预览修改背景色,动态修改在线预览颜色
  • 浙人医 × 电科金仓:异构多活架构驱动 LIS 系统国产化改造,构建集团化医院信创底座
  • 数据结构(12)