讲师中心 微信公众号
AI工具推荐 视频效率加速

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

大晨同学_8019

大晨同学_8019

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

|

332人浏览过

|

来源于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元素被移除或修改,则重新添加水印。

    chartjs-reporter
    chartjs-reporter

    此技能用于在用户需要将结构化数据(查询结果、CSV 摘要、JSON 记录或 Python 字典/列表)转换为独立的 HTML 页面时使用。

    下载
  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图片水印: 使用<img>标签作为水印元素。
<img src="watermark.png" style="position: absolute; top: 0; left: 0; width: 100px; height: auto; opacity: 0.5; pointer-events: none;">

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

热门AI工具

更多
讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

相关专题

更多
cookie
cookie

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

11979

2023.06.30

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

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

1146

2023.11.23

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

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

824

2024.02.23

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

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

1906

2025.08.19

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

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

1758

2023.08.03

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

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

2744

2023.09.04

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

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

6104

2023.10.24

字符串介绍
字符串介绍

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

5749

2023.11.24

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP水印与缩略图最新视频教程
PHP水印与缩略图最新视频教程

共10课时 | 2.1万人学习

PHP开发水印与缩略图教程
PHP开发水印与缩略图教程

共10课时 | 4.5万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn