前端如何优雅的添加水印及去除水印

🧑‍💻 写在开头
点赞 + 收藏 === 学会🤣🤣🤣

在最近接手的一个项目中,需要对整个页面加上一个水印,还需要动态修改增加背景色功能。由于使用的第三方库不支持背景色功能,故记录一下。文末会附上如何利用技术手段去除水印

在这里插入图片描述

第三方库:watermark-plus

主要使用步骤

npm i watermark-plus

import WaterMark from 'watermark-plus'


const waterMark = new WaterMark({
  content: '水印内容',
  width: 200,
  height: 100,
  alpha: 0.2,
  background: 'yellow', // 当前这个参数不支持,需要改源码
  bAlpha: background == '#ffffff' ? '0' : 0.18,
})



为什么背景色要在水印上加,而不在其他元素上加?
主要是随着项目体系的增加以及浏览器的渲染分层,会导致有些地方的背景色被别的元素遮盖。就算最后加上了,以后写css也要格外小心,防止有z-index冲突
下面说一下怎么实现增加背景色功能
先说一下watermark-plus库实现水印的原理,只有了解其中的原理才能对症下药

  1. 使用canvas把用户传入的内容绘制出来
  2. 使用toDataURL将Canvas图像转换对应的data URI(base64)
  3. 动态创建两个div元素,设置相对应的css属性
  4. 监听body下的dom元素变化(MutationObserver),如果修改或被移除的Nodes第一个元素是当前水印元素时会重新生成水印

背景色实现

  1. 在构造函数中处理background参数
  2. 使用canvas的fillStyle和fillRect增加背景色功能
  3. (o.fillStyle = t.background), o.fillRect(0, 0, t.width, t.height),
  4. 本人是基于打包后源码修改,所以代码看起来可能有点怪
    在这里插入图片描述

最终背景色能够成功展示

如何去除基于watermark-plus库生成的水印

因为该库监听的body的dom变动,所以单纯的去利用css去隐藏水印是行不通的,它会重新生成水印元素

在这里插入图片描述
可以利用源码中的逻辑判断绕过重新生成逻辑
在这里插入图片描述
只需要让removedNodes的第一个元素不是水印元素就可以了

以下是实现去除水印的测试代码(水印元素默认被body元素appendChild)

const body = document.body
const children = body.childNodes
const fragment = document.createElement('createDocumentFragment')
// 最后一个是水印元素,不需要appendChild处理; appendChild如果是文档树中已存在的,则会将原dom删除,所以这块不需要i++,children.length是个动态值
for (let i = 0; i < children.length - 2;) {
  fragment.appendChild(children[i])
}
body.innerHTML = ''
body.appendChild(fragment)

最终断点呈现的效果
在这里插入图片描述
第一个不再是水印元素,所以可以绕过重新生成水印元素的逻辑,想要修复也很简单,直接遍历MutationRecord list判断就行了

其余去除水印的方法

1、其实也可以禁用javascript来达到去掉水印效果,只不过现代网页如果离开了javascript就会丧失一些交互效果
2、利用浏览器的Overrides直接改写逻辑,这对打断点技术要求有点高,也可以尝试一下。

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。
在这里插入图片描述

### 图片水印移除的技术探讨 对于图片中的水印,直接通过前端JavaScript操作DOM的方式无法实现有效去除。这是因为嵌入到图像文件内部的水印已经成为了图像的一部分,不是简单的HTML/CSS属性可以控制的对象[^1]。 然而,在某些特定场景下,如果水印是以CSS样式形式呈现而非内嵌于图片本身,则可以通过调整或覆盖这些样式来达到视觉上的消除效果: #### 利用开发者工具临时隐藏水印 当网页加载过程中动态生成并应用至页面元素之上的水印时,可通过浏览器自带的开发者工具(F12),定位到具体的样式定义位置,并手动取消勾选`background`等相关属性的选择状态,从而即时预览无水印的效果[^4]。 #### 修改脚本逻辑阻止水印渲染 针对那些依赖于JavaScript执行期间创建并附加给文档对象模型(DOM)树节点的水印方案,可以在不影响网站正常浏览体验的前提下,采取措施干扰其正常的初始化流程。例如禁用站点内的全部JS脚本加载或是重写负责绘制水印的具体函数实现,以此防止预期外的内容被呈现在最终用户面前。 需要注意的是上述两种方式仅适用于特定类型的“伪”水印——即并非真正融合进了原始素材里的标记;而对于真实存在于图形资源内部的数据则完全不起作用。要彻底清除这类永久性的印记通常需要借助专业的图像编辑软件如Adobe Photoshop等来进行复杂的手动修复工作,或者寻找专门设计用于自动化批量处理此类任务的应用程序和服务提供商。 ```javascript // 示例:拦截并修改Watermark Plus库的行为以阻止默认水印显示 (function() { const originalCreate = WatermarkPlus.prototype.create; WatermarkPlus.prototype.create = function(options){ options.textOpacity = 0; // 设置透明度为零使文字不可见 return originalCreate.call(this, options); }; })(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值