0

0

js如何实现水印效果 前端动态生成防泄密水印

冰火之心

冰火之心

发布时间:2025-06-25 18:09:02

|

292人浏览过

|

来源于php中文网

原创

在javascript中实现水印效果主要有canvas水印和dom水印两种方式。1. canvas水印通过创建canvas元素并使用filltext()方法绘制文字,性能较好且不易被移除,但实现较复杂;2. dom水印则通过创建div元素设置样式来显示水印,更加灵活易控,但容易被用户修改或移除。动态生成水印内容可在客户端或服务端根据用户信息等唯一标识生成,并通过加密、定期更新等方式提升安全性。为防止水印被轻易移除,可采用canvas水印结合mutationobserver监听变化、添加多重水印、服务端渲染水印、代码混淆及定期更新生成逻辑等方式。优化水印性能可通过减少数量、使用css sprites、优化canvas渲染、启用硬件加速延迟加载等手段实现。此外,也可使用图片水印,canvas通过drawimage()方法绘制图片水印,dom则使用img标签实现,虽增加加载时间但更难移除。

js如何实现水印效果 前端动态生成防泄密水印

在JavaScript中实现水印效果,核心在于利用Canvas或者直接操作DOM元素,将水印文字或图像叠加到目标内容之上。动态生成防泄密水印,则需要在客户端或服务端根据用户信息或其他唯一标识动态生成水印内容,并将其应用到页面上。

js如何实现水印效果 前端动态生成防泄密水印

解决方案

实现水印效果,主要有两种方式:Canvas水印和DOM水印。Canvas水印的优点是性能较好,且不易被用户轻易移除,但实现相对复杂。DOM水印则更加灵活,易于控制,但更容易被用户通过开发者工具修改或移除。

js如何实现水印效果 前端动态生成防泄密水印

1. Canvas水印:

立即学习前端免费学习笔记(深入)”;

js如何实现水印效果 前端动态生成防泄密水印
  • 创建一个Canvas元素,并设置其大小与需要添加水印的区域一致。
  • 获取Canvas的2D渲染上下文。
  • 设置水印文字的字体、颜色、旋转角度等。
  • 使用fillText()方法将水印文字绘制到Canvas上,重复绘制以覆盖整个区域。
  • 将Canvas元素叠加到目标区域之上。

示例代码:

function addCanvasWatermark(container, text) {
  const canvas = document.createElement('canvas');
  const ctx = canvas.getContext('2d');

  canvas.width = container.offsetWidth;
  canvas.height = container.offsetHeight;
  canvas.style.position = 'absolute';
  canvas.style.top = '0';
  canvas.style.left = '0';
  canvas.style.pointerEvents = 'none'; // 防止遮挡下方元素

  ctx.font = '20px Arial';
  ctx.fillStyle = 'rgba(0, 0, 0, 0.2)';
  ctx.textAlign = 'center';
  ctx.textBaseline = 'middle';
  ctx.rotate(-15 * Math.PI / 180); // 旋转角度

  for (let i = 0; i < 10; i++) { // 简单重复绘制
    for (let j = 0; j < 10; j++) {
      ctx.fillText(text, canvas.width / 2 + i * 150, canvas.height / 2 + j * 50);
    }
  }

  container.appendChild(canvas);
}

// 使用示例
const targetElement = document.getElementById('target');
addCanvasWatermark(targetElement, '内部资料 - 用户名');

2. DOM水印:

  • 创建一个或多个div元素,用于显示水印文字。
  • 设置div元素的样式,包括字体、颜色、透明度、旋转角度、定位等。
  • div元素叠加到目标区域之上,并重复排列以覆盖整个区域。

示例代码:

function addDomWatermark(container, text) {
  const watermarkDiv = document.createElement('div');
  watermarkDiv.textContent = text;
  watermarkDiv.style.position = 'absolute';
  watermarkDiv.style.top = '0';
  watermarkDiv.style.left = '0';
  watermarkDiv.style.width = '100%';
  watermarkDiv.style.height = '100%';
  watermarkDiv.style.textAlign = 'center';
  watermarkDiv.style.fontSize = '20px';
  watermarkDiv.style.color = 'rgba(0, 0, 0, 0.2)';
  watermarkDiv.style.transform = 'rotate(-15deg)';
  watermarkDiv.style.pointerEvents = 'none'; // 防止遮挡下方元素
  watermarkDiv.style.overflow = 'hidden';

  // 创建多个水印,重复排列
  const watermarkWrapper = document.createElement('div');
  watermarkWrapper.style.position = 'relative';
  watermarkWrapper.style.width = '200%';
  watermarkWrapper.style.height = '200%';
  watermarkWrapper.style.top = '-50%';
  watermarkWrapper.style.left = '-50%';

  for (let i = 0; i < 4; i++) {
    const singleWatermark = watermarkDiv.cloneNode(true);
    singleWatermark.style.position = 'absolute';
    singleWatermark.style.top = (i % 2 === 0) ? '0' : '50%';
    singleWatermark.style.left = (i < 2) ? '0' : '50%';
    watermarkWrapper.appendChild(singleWatermark);
  }

  container.appendChild(watermarkWrapper);
}

// 使用示例
const targetElement = document.getElementById('target');
addDomWatermark(targetElement, '内部资料 - 用户名');

3. 动态生成水印:

动态生成水印的关键在于获取用户信息或其他唯一标识,并将其作为水印内容。可以在客户端获取,也可以在服务端生成水印图片或字符串,然后传递给客户端。

  • 客户端获取: 可以通过Cookie、LocalStorage、SessionStorage等方式获取用户信息。
  • 服务端生成: 服务端可以根据用户ID、IP地址、时间戳等信息生成唯一的水印字符串,或者生成包含这些信息的图片,然后将这些信息传递给客户端。

安全性考虑:

  • 客户端生成水印容易被篡改,因此更安全的做法是在服务端生成水印,并将其作为图片或数据传递给客户端。
  • 对水印内容进行加密,防止用户直接获取敏感信息。
  • 定期更新水印内容,防止被恶意用户破解。

如何防止水印被轻易移除?

防止水印被移除是一个持续对抗的过程,没有绝对安全的方案,但可以采取一些措施增加移除的难度。

  1. Canvas水印 + MutationObserver: 使用Canvas水印,并使用MutationObserver监听目标区域的变化,如果发现Canvas元素被移除或修改,则重新添加水印。

    SoftGist
    SoftGist

    SoftGist是一个软件工具目录站,每天为您带来最好、最令人兴奋的软件新产品。

    下载
  2. 多重水印: 添加多个水印,并使用不同的方式实现,例如Canvas水印和DOM水印同时使用。

  3. 服务端渲染水印: 在服务端将水印直接渲染到图片或PDF文件中,这样客户端就无法移除水印。

  4. 混淆代码: 对JavaScript代码进行混淆,增加分析和修改的难度。

  5. 定期更新水印生成逻辑: 定期更新水印生成逻辑,防止被恶意用户找到规律并移除。

如何优化水印的性能?

水印可能会影响页面的性能,尤其是在大型页面或移动设备上。以下是一些优化水印性能的建议:

  1. 减少水印数量: 尽量减少水印的数量,避免过度覆盖整个页面。

  2. 使用CSS Sprites: 如果使用图片水印,可以将多个水印图片合并成一个CSS Sprite,减少HTTP请求。

  3. 优化Canvas渲染: 避免在Canvas上进行复杂的计算和绘制操作,尽量使用简单的图形和文字。

  4. 使用硬件加速: 启用CSS硬件加速,例如使用transform: translateZ(0)will-change属性。

  5. 延迟加载水印: 在页面加载完成后再添加水印,避免阻塞页面的渲染。

除了文字水印,还可以添加图片水印吗?

当然可以。无论是Canvas水印还是DOM水印,都可以添加图片水印。

  • Canvas图片水印: 使用drawImage()方法将图片绘制到Canvas上。
const img = new Image();
img.onload = function() {
  ctx.drawImage(img, x, y, width, height);
};
img.src = 'watermark.png';
  • DOM图片水印: 使用js如何实现水印效果 前端动态生成防泄密水印标签作为水印元素。
@@##@@

图片水印可以更有效地防止被移除,但也会增加页面的体积和加载时间。需要根据实际情况进行权衡。

js如何实现水印效果 前端动态生成防泄密水印

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
cookie
cookie

Cookie 是一种在用户计算机上存储小型文本文件的技术,用于在用户与网站进行交互时收集和存储有关用户的信息。当用户访问一个网站时,网站会将一个包含特定信息的 Cookie 文件发送到用户的浏览器,浏览器会将该 Cookie 存储在用户的计算机上。之后,当用户再次访问该网站时,浏览器会向服务器发送 Cookie,服务器可以根据 Cookie 中的信息来识别用户、跟踪用户行为等。

6427

2023.06.30

document.cookie获取不到怎么解决
document.cookie获取不到怎么解决

document.cookie获取不到的解决办法:1、浏览器的隐私设置;2、Same-origin policy;3、HTTPOnly Cookie;4、JavaScript代码错误;5、Cookie不存在或过期等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

347

2023.11.23

阻止所有cookie什么意思
阻止所有cookie什么意思

阻止所有cookie意味着在浏览器中禁止接受和存储网站发送的cookie。阻止所有cookie可能会影响许多网站的使用体验,因为许多网站使用cookie来提供个性化服务、存储用户信息或跟踪用户行为。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

411

2024.02.23

cookie与session的区别
cookie与session的区别

本专题整合了cookie与session的区别和使用方法等相关内容,阅读专题下面的文章了解更详细的内容。

92

2025.08.19

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

298

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1501

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

624

2023.11.24

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号