前端面試寶典---前端水印

明水印

1. 背景圖

通過css的background-image加載背景圖

2. canvas+background水印

前端水印實現思路與示例代碼

一、核心實現思路
  1. Canvas動態生成水印
    通過Canvas繪制文本或圖案,將生成的圖像轉為Base64格式,作為背景圖重復平鋪到目標元素上。例如:

    function createWatermark(text) {const canvas = document.createElement('canvas');const ctx = canvas.getContext('2d');canvas.width = 200;canvas.height = 150;ctx.font = '12px Arial';ctx.fillStyle = 'rgba(200,200,200,0.2)';ctx.rotate(-30 * Math.PI / 180); // 傾斜角度ctx.fillText(text, 10, 100);return canvas.toDataURL('image/png');
    }
    
  2. 防篡改機制

    • 使用MutationObserver監聽DOM變化,若水印元素被刪除則重新注入
    • 禁止控制臺操作:禁用右鍵菜單、屏蔽開發者工具快捷鍵
    document.addEventListener('contextmenu', e => e.preventDefault());
    
  3. 容器綁定
    將水印作為獨立圖層覆蓋在目標內容上方,通過CSS確保全屏狀態仍可見:

    .watermark-container {position: relative;
    }
    .watermark-layer {position: absolute;pointer-events: none;z-index: 9999;background: url('data:image/png;base64,...');
    }
    
二、完整示例代碼
<!DOCTYPE html>
<html><body><style>.watermark-container {position: relative;}.watermark-layer {position: absolute;pointer-events: none;z-index: 9999;background: url('data:image/png;base64,...');}</style><div id="content">需要保護的內容</div><script>function createWatermark (text) {const canvas = document.createElement('canvas')const ctx = canvas.getContext('2d')canvas.width = 200canvas.height = 150ctx.font = '12px Arial'ctx.fillStyle = 'rgba(200,200,200,0.2)'ctx.rotate(-30 * Math.PI / 180) // 傾斜角度ctx.fillText(text, 10, 100)return canvas.toDataURL('image/png')}function initWatermark (text = '機密文件') {const watermark = document.createElement('div')watermark.style.backgroundImage = `url(${createWatermark(text)})`watermark.style.position = 'fixed'watermark.style.top = 0watermark.style.bottom = 0watermark.style.right = 0watermark.style.left = 0watermark.style.pointerEvents = 'none'// 防刪除監聽const observer = new MutationObserver(mutations => {if (!document.contains(watermark)) {document.body.appendChild(watermark)}})observer.observe(document.body, { childList: true })document.body.appendChild(watermark)}initWatermark('嚴禁復制');</script>
</body></html>
三、注意事項
  1. 動態水印
    可添加時間戳、用戶ID等可變信息增強追蹤能力:

    const dynamicText = `${username} ${new Date().toLocaleString()}`;
    
  2. 樣式優化

    • 使用background-repeat: repeat平鋪
    • 調整rgba透明度值平衡可見性與內容遮擋
  3. 跨框架實現
    Vue/React可通過高階組件封裝水印邏輯,例如:

    const withWatermark = (Component) => (props) => (<div className="watermark-wrapper"><Component {...props} /></div>
    )
    

純canvas水印

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Canvas水印示例</title><style>.watermark {position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 1000;pointer-events: none;opacity: 0.2;}</style>
</head>
<body><canvas id="watermarkCanvas" class="watermark"></canvas><div><h1>內容區域</h1><p>這是需要加水印的內容</p></div><script>window.onload = function() {var canvas = document.getElementById('watermarkCanvas');var ctx = canvas.getContext('2d');canvas.width = window.innerWidth;canvas.height = window.innerHeight;var text = '水印文本';var width = canvas.width;var height = canvas.height;ctx.font = '30px Arial';ctx.fillStyle = 'rgba(0, 0, 0, 0.1)';ctx.textAlign = 'center';ctx.textBaseline = 'middle';// 旋轉并重復繪制水印文本for (var x = 0; x < width; x += 200) {for (var y = 0; y < height; y += 200) {ctx.save();ctx.translate(x, y);ctx.rotate(- Math.PI / 4);ctx.fillText(text, 0, 0);ctx.restore();}}};</script>
</body>
</html>

svg水印

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>SVG水印示例</title><style>.watermark {position: fixed;top: 0;left: 0;right: 0;bottom: 0;z-index: 1000;pointer-events: none;opacity: 0.2;}</style>
</head>
<body><div class="watermark"><svg width="100%" height="100%"><text x="50%" y="50%" dominant-baseline="middle" text-anchor="middle" font-size="30" fill="rgba(0,0,0,0.1)" transform="rotate(-45, 50, 50)">水印文本</text></svg></div><div><h1>內容區域</h1><p>這是需要加水印的內容</p></div>
</body>
</html>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/83440.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/83440.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/83440.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

惡意軟件清理工具,讓Mac電腦安全更簡單

?你的Mac最近是不是開始表演"電子迷惑行為"&#xff1f;瀏覽器主頁突然變成澳門賭場&#xff0c;風扇轉得比直升機螺旋槳還猛......恭喜你&#xff01;可能中獎獲得"惡意軟件大禮包"&#xff01;別慌&#xff0c;今天就教你用惡意軟件清理工具化身數字特工…

Spring Boot 3.X 下Redis緩存的嘗試(二):自動注解實現自動化緩存操作

前言 上文我們做了在Spring Boot下對Redis的基本操作&#xff0c;如果頻繁對Redis進行操作而寫對應的方法顯示使用注釋更會更高效&#xff1b; 比如&#xff1a; 依之前操作對一個業務進行定入緩存需要把數據拉取到后再定入&#xff1b; 而今天我們可以通過注釋的方式不需要額外…

Deepseek應用技巧-Dify安裝和踩坑指南

前言&#xff1a;Dify的名號是非常大的&#xff0c;作為私有化AI部署中必不可少的一個組件&#xff0c;他的功能和COZE十分相似&#xff0c;可以進行工作流和智能體的搭建&#xff0c;有非常強大的功能&#xff0c;那本節就將來揭開Dify的神秘的面紗&#xff0c;首先看一下Dify…

ubuntu24.04安裝教程(圖文詳解)

Ubuntu 24.04 LTS&#xff0c;代號 Noble Numbat&#xff0c;于 2024 年 4 月 25 日發布&#xff0c;現在可以從 Ubuntu 官方網站及其鏡像下載。此版本將在 2029 年 4 月之前接收為期五年的官方安全和維護更新。 關于 Ubuntu 24.04 LTS 的一些關鍵點&#xff1a; 發布日期&am…

數據綁定頁面的完整的原理、邏輯關系、實現路徑是什么?頁面、表格、字段、屬性、值、按鈕、事件、模型、腳本、服務編排、連接器等之間的關系又是什么?

目錄 一、核心概念:什么是數據綁定頁面? 二、涉及的組件及其邏輯關系 頁面(Page): 表格(Table): 字段(Field): 屬性(Property): 值(Value): 按鈕(Button): 事件(Event): 模型(Model): 腳本(Script): 服務(Service): 服務編排(Se…

【 SpringCloud | 微服務 網關技術 】

單體架構時我們只需要完成一次用戶登錄、身份校驗&#xff0c;就可以在所有業務中獲取到用戶信息。而微服務拆分后&#xff0c;每個微服務都獨立部署&#xff0c;這就存在一些問題&#xff1a; 每個微服務都需要編寫登錄校驗、用戶信息獲取的功能嗎&#xff1f; 當微服務之間調…

python,Dataframe基于所有包含某個關鍵字的列等于某個值過濾

在 Python 中&#xff0c;使用 Pandas 的 DataFrame 丟棄符合特定條件的行&#xff0c;條件為所有包含某個關鍵字的列中&#xff0c;等于某個值&#xff08;即所有包含某個關鍵字的列中等于某個值的行&#xff09;&#xff0c;可用以下方法實現&#xff1a; import pandas as …

50天50個小項目 (Vue3 + Tailwindcss V4) ? | Sound Board(音響控制面板)

&#x1f4c5; 我們繼續 50 個小項目挑戰&#xff01;—— SoundBoard 組件 倉庫地址&#xff1a;https://github.com/SunACong/50-vue-projects 項目預覽地址&#xff1a;https://50-vue-projects.vercel.app/ &#x1f3af; 組件目標 實現一個響應式按鈕面板&#xff0c;點…

在Ubuntu20.04上安裝ROS Noetic

本章教程,主要記錄在Ubuntu20.04上安裝ROS Noetic。 一、添加軟件源 sudo sh -c . /etc/lsb-release && echo "deb http://mirrors.tuna.tsinghua.edu.cn/ros/ubuntu/ `lsb_release -cs` main" > /etc/apt/sources.list.d/ros-latest.list二、設置秘鑰 …

神經網絡基礎:從單個神經元到多層網絡(superior哥AI系列第3期)

&#x1f9e0; 神經網絡基礎&#xff1a;從單個神經元到多層網絡&#xff08;superior哥AI系列第3期&#xff09; 哈嘍&#xff01;各位AI探索者們&#xff01;&#x1f44b; 上期我們把數學"怪獸"給馴服了&#xff0c;是不是感覺還挺輕松的&#xff1f;今天我們要進…

03 APP 自動化-定位元素工具元素定位

文章目錄 一、Appium常用元素定位工具1、U IAutomator View Android SDK 自帶的定位工具2、Appium Desktop Inspector3、Weditor安裝&#xff1a;Weditor工具的使用 4、uiautodev通過定位工具獲取app頁面元素有哪些屬性 二、app 元素定位方法 一、Appium常用元素定位工具 1、U…

Java消息隊列與安全實戰:謝飛機的燒餅攤故事

Java消息隊列與安全實戰&#xff1a;謝飛機的燒餅攤故事 第一輪&#xff1a;消息隊列與緩存 面試官&#xff1a;謝飛機&#xff0c;Kafka和RabbitMQ在電商場景如何選型&#xff1f; 謝飛機&#xff1a;&#xff08;摸出燒餅&#xff09;Kafka適合訂單日志處理&#xff0c;像…

Unity中的MonoSingleton<T>與Singleton<T>

1.MonoSingleton 代碼部分 using UnityEngine;/// <summary> /// MonoBehaviour單例基類 /// 需要掛載到GameObject上使用 /// </summary> public class MonoSingleton<T> : MonoBehaviour where T : MonoSingleton<T> {private static T _instance;…

day 40 python打卡

仔細學習下測試和訓練代碼的邏輯&#xff0c;這是基礎&#xff0c;這個代碼框架后續會一直沿用&#xff0c;后續的重點慢慢就是轉向模型定義階段了。 # 先繼續之前的代碼 import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataL…

進階日記(一)大模型的本地部署與運行

目錄 一、背景知識 為什么要在本地部署大模型&#xff1f; 在本地部署大模型需要做哪些準備工作&#xff1f; &#xff08;1&#xff09;硬件配置 &#xff08;2&#xff09;軟件環境 有哪些部署工具可供選擇&#xff1f; 二、Ollma安裝 Ollama安裝完之后&#xff0c;還…

Spring Boot Starter 自動裝配原理全解析:從概念到實踐

Spring Boot Starter 自動裝配原理全解析&#xff1a;從概念到實踐 在Spring Boot開發中&#xff0c;Starter和自動裝配是兩個核心概念&#xff0c;它們共同構成了“開箱即用”的開發體驗。通過引入一個Starter依賴&#xff0c;開發者可以快速集成第三方組件&#xff08;如Red…

win11回收站中出現:查看回收站中是否有以下項: WPS云盤回收站

好久沒更新了&#xff0c;首先祝所有大朋友、小朋友六一兒童節快樂&#xff0c;真的希望我們永遠都不會長大呀&#xff0c;長大真的好累呀(?_?) 免責聲明 筆者先來個免責聲明吧&#xff0c;被網上的陰暗面嚇到了 若讀者參照筆者的這篇文章所執行的操作中途或后續出現的任何…

網絡安全大模型理解

一、網絡安全大模型的概述 網絡安全大模型是一種用于識別和應對各種網絡安全威脅的模型。它通過分析網絡數據包、網絡行為等信息&#xff0c;識別潛在的網絡安全事件&#xff0c;并采取相應的措施進行防御。網絡安全大模型主要包括以下幾個部分&#xff1a; 1. 數據預處理&am…

C++語法架構解說

C 是一種功能強大且靈活的編程語言&#xff0c;廣泛應用于系統編程、游戲開發、嵌入式系統、金融軟件等領域。 其語法架構復雜且豐富&#xff0c;涵蓋了從基礎語法到高級特性的各個方面。 對 C 語法架構 的詳細解析&#xff0c;涵蓋其核心語法結構、面向對象編程&#xff08;…

審計- 1- 審計概述

1.財務報表審計的概念 財務報表審計是指注冊會計師對財務報表是否不存在重大錯報提供合理保證&#xff0c;以積極方式提出意見&#xff0c;增強除管理層之外的預期使用者對財務報表信賴的程度。 1.1 審計業務三方關系人 注冊會計師對財務報表發表審計意見是注冊會計師的責任管…