前端实现添加水印功能的常见方式小结
作者:懒羊羊我小弟
一、简介
简单来说,前端水印就是在网页或应用程序的前端界面上添加的一种标记,通常是文本、图标或图案等形式。它就像给你的数字内容贴上了一个独特的 “标签”,用于标识内容的归属、防止未经授权的使用和传播。比如,一些在线图片库网站会在用户浏览的图片上添加透明的水印,显示图片的版权信息;视频平台也会在播放的视频角落显示平台名称或用户标识作为水印。
使用价值:
信息防盗:防止敏感信息截图/录屏传播(金融/政务场景)
数据溯源:通过隐藏标识追踪泄露源头
品牌标识:增强产品品牌曝光(Saas类产品常见)
二、技术实现方案对比
1. DOM元素覆盖方案
实现原理:通过绝对定位div覆盖目标区域
<style> .watermark { position: absolute; pointer-events: none; z-index: 9999; opacity: 0.3; transform: rotate(-15deg); } </style> <script> function createDOMWatermark(text) { const watermark = document.createElement('div'); watermark.className = 'watermark'; watermark.textContent = text; // 动态计算位置 const updatePosition = () => { const { clientWidth, clientHeight } = document.documentElement; watermark.style.width = `${clientWidth}px`; watermark.style.height = `${clientHeight}px`; }; window.addEventListener('resize', updatePosition); updatePosition(); document.body.appendChild(watermark); // 防删除保护 const observer = new MutationObserver((mutations) => { if (!document.contains(watermark)) { document.body.appendChild(watermark.cloneNode(true)); } }); observer.observe(document.body, { childList: true }); } </script>
- 优势:实现简单、支持动态更新
- 缺陷:易通过开发者工具篡改、性能开销大
2. Canvas动态绘制方案
实现原理:生成Base64图片作为背景
function createWatermarkCanvas(text) { const canvas = document.createElement("canvas"); const ctx = canvas.getContext("2d"); canvas.width = 300; canvas.height = 200; ctx.fillStyle = "rgba(100,100,100,0.3)"; ctx.font = "16px Arial"; ctx.rotate((-20 * Math.PI) / 180); ctx.fillText(text, 40, 180); const dataUrl = `url(${canvas.toDataURL("image/png")})`; document.body.style.backgroundImage = dataUrl; // 防止删除元素 const observer = new MutationObserver((mutations) => { if ( mutations.some( (m) => m.target === document.body && m.attributeName === "style" && !m.target.style.backgroundImage ) ) { document.body.style.backgroundImage = dataUrl; } }); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ["style"], }); } export default createWatermarkCanvas;
- 优势:防篡改等级中等、支持复杂图形
- 缺陷:高清屏模糊、无法动态更新内容
3. SVG矢量方案
function createSVGWatermark(text) { const svg = ` <svg width="300" height="200" xmlns="http://www.w3.org/2000/svg"> <text x="50" y="180" transform="rotate(-20 50,180)" fill="rgba(100,100,100,0.3)" font-size="16"> ${text} </text> </svg>`; // 编码为 base64 const btoa = (str) => window.btoa(unescape(encodeURIComponent(str))); const dataUrl = `url(data:image/svg+xml;base64,${btoa(svg)})`; document.body.style.backgroundImage = dataUrl; // 防止删除元素 const observer = new MutationObserver((mutations) => { if ( mutations.some( (m) => m.target === document.body && m.attributeName === "style" && !m.target.style.backgroundImage ) ) { document.body.style.backgroundImage = dataUrl; } }); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ["style"], }); } export default createSVGWatermark;
- 优势:矢量清晰、支持复杂图形
- 缺陷:旧浏览器兼容性问题
4. 常用水印插件
1.watermark-dom
简介:这是一个轻量级的 JavaScript 库,专门用于为网页添加水印。它使用简单,可高度定制水印的样式和内容。
特点
- 支持自定义水印的文本内容、字体、颜色、透明度、旋转角度等。
- 可以通过 JavaScript 动态创建和修改水印。
- 可以应用到指定的 DOM 元素或整个页面。
使用示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Watermark Example</title> <script src="https://cdn.jsdelivr.net/npm/watermark-dom@3.0.4/dist/watermark.min.js"></script> </head> <body> <div id="content"> 这是页面的主要内容。 </div> <script> watermark({ watermark_txt: 'Confidential', watermark_x: 20, watermark_y: 20, watermark_rows: 20, watermark_cols: 20, watermark_x_space: 50, watermark_y_space: 50, watermark_font: '微软雅黑', watermark_color: 'rgba(0, 0, 0, 0.15)', watermark_fontsize: '18px', watermark_alpha: 0.1, watermark_angle: 20 }); </script> </body> </html>
2.vue-watermark-directive
简介:专为 Vue.js 框架设计的水印指令插件,方便在 Vue 项目中快速添加水印。
特点
- 以指令的形式使用,简单易用,与 Vue 组件集成良好。
- 支持动态更新水印内容和样式。
- 可以应用到单个组件或整个应用。
使用示例
npm install vue-watermark-directive
<template> <div v-watermark="'Secret Information'"> 这是 Vue 组件的内容。 </div> </template> <script> import VueWatermarkDirective from 'vue-watermark-directive'; export default { directives: { watermark: VueWatermarkDirective } }; </script>
3.react-watermark
简介:用于 React 项目的水印组件,帮助开发者在 React 应用中轻松添加水印。
特点
- 提供了封装好的 React 组件,方便在 JSX 中使用。
- 支持自定义水印的各种属性,如文本、颜色、大小等。
- 可以根据组件的状态动态更新水印。
使用示例
npm install react-watermark
import React from 'react'; import ReactDOM from 'react-dom/client'; import Watermark from 'react-watermark'; const root = ReactDOM.createRoot(document.getElementById('root')); root.render( <Watermark content="Copyright" fontSize={16} color="rgba(0, 0, 0, 0.2)"> <div> 这是 React 应用的内容。 </div> </Watermark> );
4.jquery-watermark
简介:基于 jQuery 库的水印插件,适合已经在项目中使用 jQuery 的开发者。
特点
- 利用 jQuery 的选择器和方法,方便地为指定元素添加水印。
- 可以通过配置参数自定义水印的样式和行为。
使用示例
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>jQuery Watermark Example</title> <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script> <script src="https://cdn.jsdelivr.net/npm/jquery-watermark@1.0.0/dist/jquery.watermark.min.js"></script> </head> <body> <div id="target"> 这是要添加水印的元素。 </div> <script> $(document).ready(function () { $('#target').watermark({ text: 'Private', font: 'Arial', color: 'rgba(0, 0, 0, 0.1)', fontSize: '20px' }); }); </script> </body> </html>
这些插件各有特点,可以根据项目的技术栈和具体需求选择合适的水印插件。
三、安全增强方案
1.DOM监控系统
const securityObserver = new MutationObserver((mutations) => { mutations.forEach((mutation) => { if (mutation.removedNodes.length) { mutation.removedNodes.forEach(node => { if (node.classList.contains('watermark')) { document.body.appendChild(node.cloneNode(true)); } }); } }); }); securityObserver.observe(document.body, { attributes: true, childList: true, subtree: true });
2.多重防御机制
CSS防护层
.watermark-protect { user-select: none; -webkit-user-drag: none; pointer-events: none !important; }
事件拦截
document.addEventListener('contextmenu', e => e.preventDefault()); document.addEventListener('keydown', (e) => { if (e.ctrlKey && e.key === 's') e.preventDefault(); });
四、性能优化策略
优化手段 | 实施方式 | 效果提升 |
---|---|---|
离屏Canvas | 使用Worker预生成水印图片 | 40%~60% |
CSS will-change | 对水印容器设置will-change: transform | 减少重绘 |
分层渲染 | 使用requestAnimationFrame批量更新 | 帧率稳定 |
按需渲染 | IntersectionObserver控制可见区域渲染 | 内存降低 |
// 离屏Canvas示例 const offscreenCanvas = new OffscreenCanvas(300, 200); const worker = new Worker('./watermark-worker.js'); worker.postMessage({ canvas: offscreenCanvas, text: 'Secure Mark' });
五、技术选型建议
- 普通业务场景:建议使用 DOM 方案,并结合 MutationObserver 进行防护。
- 安全敏感场景:采用 Canvas 动态生成水印,并与用户指纹绑定,增强安全性。
- 高清显示需求:选择 SVG 方案,并通过媒体查询进行适配,确保在不同设备上都能清晰显示。
- 移动端场景:可以使用 CSS 重复背景,并配置 touch-action,提升用户体验。
一个完整的水印系统应该包含版本管理、动态更新、埋点上报、异常监控等功能模块。同时,建议结合服务端实现水印信息的加密存储,以保证水印数据的不可篡改性。
到此这篇关于前端实现添加水印功能的常见方式小结的文章就介绍到这了,更多相关前端添加水印内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!