AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當(dāng)前位置:首頁(yè) > 科技  > 軟件

Vue3問(wèn)題:如何在頁(yè)面上添加水印?

來(lái)源: 責(zé)編: 時(shí)間:2024-03-19 09:24:20 198觀看
導(dǎo)讀1. 需求分析為了防止網(wǎng)站信息被盜用,以及維護(hù)版權(quán)標(biāo)識(shí),常常需要在頁(yè)面、圖片或視頻上添加獨(dú)特水印,以作區(qū)分。同時(shí),水印的添加不僅僅滿足于添加,有時(shí)候還要能防止用戶惡意篡改,時(shí)刻保證水印的功效。所以,這次問(wèn)題我分為了兩

QUt28資訊網(wǎng)——每日最新資訊28at.com

1. 需求分析

為了防止網(wǎng)站信息被盜用,以及維護(hù)版權(quán)標(biāo)識(shí),常常需要在頁(yè)面、圖片或視頻上添加獨(dú)特水印,以作區(qū)分。QUt28資訊網(wǎng)——每日最新資訊28at.com

同時(shí),水印的添加不僅僅滿足于添加,有時(shí)候還要能防止用戶惡意篡改,時(shí)刻保證水印的功效。QUt28資訊網(wǎng)——每日最新資訊28at.com

所以,這次問(wèn)題我分為了兩種情況:一種是僅添加水印僅可,另一種是添加水印且要防篡改。QUt28資訊網(wǎng)——每日最新資訊28at.com

下面我將把實(shí)現(xiàn)一一列出。QUt28資訊網(wǎng)——每日最新資訊28at.com

QUt28資訊網(wǎng)——每日最新資訊28at.com

2. 實(shí)現(xiàn)步驟

(1)僅添加水印情況

對(duì)于僅需要添加水印的情況,直接使用第三方UI庫(kù)中的水印組件即可,簡(jiǎn)單快速。QUt28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然,我們也可以選擇自己造輪子,用Canvas來(lái)畫,但是對(duì)于工作而言,我覺(jué)得這樣應(yīng)該盡量避免。QUt28資訊網(wǎng)——每日最新資訊28at.com

這里我使用ElementPlus 2.4.0中,新出的Watermark水印組件作為例子。QUt28資訊網(wǎng)——每日最新資訊28at.com

實(shí)現(xiàn)代碼:QUt28資訊網(wǎng)——每日最新資訊28at.com

<template><el-watermark:width="130":height="30"image="https://element-plus.org/images/element-plus-logo.svg"><div style="height: 500px" /></el-watermark></template>

效果如下:QUt28資訊網(wǎng)——每日最新資訊28at.com

QUt28資訊網(wǎng)——每日最新資訊28at.com

當(dāng)然要注意的是,ElementPlus的依賴版本一定要是2.4.0之后的。QUt28資訊網(wǎng)——每日最新資訊28at.com

(2)添加水印且要防篡改情況

像ElementPlus提供的水印組件,是不支持防篡改功能的。QUt28資訊網(wǎng)——每日最新資訊28at.com

也就是說(shuō),如果有用戶通過(guò)瀏覽器的控制臺(tái)進(jìn)行元素屬性的修改,是可以把頁(yè)面中的水印隱藏的。所以為了安全起見(jiàn),是很需要做防篡改處理的。QUt28資訊網(wǎng)——每日最新資訊28at.com

為了保證自定義水印的靈活性,這里我使用了原生js的寫法,并且代碼參考了渡一官方大佬的文章。QUt28資訊網(wǎng)——每日最新資訊28at.com

簡(jiǎn)言之,就是利用Canvas繪制水印圖像,以及利用MutationObserver對(duì)象來(lái)監(jiān)聽Dom節(jié)點(diǎn)或其子節(jié)點(diǎn)的變化以實(shí)現(xiàn)防篡改處理。QUt28資訊網(wǎng)——每日最新資訊28at.com

代碼實(shí)現(xiàn)如下:QUt28資訊網(wǎng)——每日最新資訊28at.com

先寫一個(gè)hook函數(shù)useWatermarkBg,在其中用Canvas繪制水印圖像。QUt28資訊網(wǎng)——每日最新資訊28at.com

import { computed } from 'vue';export default function useWatermarkBg (props) {return computed(() => {// 創(chuàng)建一個(gè) canvasconst canvas = document.createElement('canvas');const devicePixelRatio = window.devicePixelRatio || 1;// 設(shè)置字體大小const fontSize = props.fontSize * devicePixelRatio;const font = fontSize + 'px serif';const ctx = canvas.getContext('2d');// 獲取文字寬度ctx.font = font;const { width } = ctx.measureText(props.text);const canvasSize = Math.max(100, width) + props.gap * devicePixelRatio;canvas.width = canvasSize;canvas.height = canvasSize;ctx.translate(canvas.width / 2, canvas.height / 2);// 旋轉(zhuǎn) 45 度讓文字變傾斜ctx.rotate((Math.PI / 180) * -45);ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';ctx.font = font;ctx.textAlign = 'center';ctx.textBaseline = 'middle';// 將文字畫出來(lái)ctx.fillText(props.text, 0, 0);return {base64: canvas.toDataURL(),size: canvasSize,styleSize: canvasSize / devicePixelRatio,};});}

再封裝一個(gè)水印公共組件WaterMark,在其中調(diào)用useWatermarkBg函數(shù)生成水印圖像,以及添加水印、做防篡改處理。QUt28資訊網(wǎng)——每日最新資訊28at.com

在mounted中,創(chuàng)建MutationObserver實(shí)例,監(jiān)聽水印DOM節(jié)點(diǎn)的變化,在節(jié)點(diǎn)刪除或?qū)傩孕薷臅r(shí)設(shè)置依賴,發(fā)出重新添加水印的通知。QUt28資訊網(wǎng)——每日最新資訊28at.com

在watchEffect中,進(jìn)行收集依賴,只要依賴變化了,它就會(huì)重新添加水印圖像,達(dá)到防篡改效果。QUt28資訊網(wǎng)——每日最新資訊28at.com

值得一提的是,因?yàn)樘砑铀〉脑硎墙o頁(yè)面添加一個(gè)絕對(duì)定位的重復(fù)水印背景的div,但是,如果這樣我們就不能點(diǎn)擊div下層的元素了。QUt28資訊網(wǎng)——每日最新資訊28at.com

所以,這里還用了一個(gè)叫pointerEvents的css屬性,設(shè)置值為none,從而使元素不會(huì)接收鼠標(biāo)事件,鼠標(biāo)事件會(huì)透過(guò)元素傳遞到下層的元素上。QUt28資訊網(wǎng)——每日最新資訊28at.com

<template><div class="watermark-container" ref="parentRef"><slot></slot></div></template><script setup>import { onMounted, onUnmounted, ref, watchEffect } from 'vue';import useWatermarkBg from '@/hooks/useWatermarkBg.js';const props = defineProps({text: {type: String,required: true,default: 'watermark',},fontSize: {type: Number,default: 40,},gap: {type: Number,default: 20,},});const bg = useWatermarkBg(props);const parentRef = ref(null);const flag = ref(0); // 聲明一個(gè)依賴let div;watchEffect(() => {flag.value; // 將依賴放在 watchEffect 里if (!parentRef.value) {return;}if (div) {div.remove();}const { base64, styleSize } = bg.value;div = document.createElement('div');div.style.backgroundImage = `url(${base64})`;div.style.backgroundSize = `${styleSize}px ${styleSize}px`;div.style.backgroundRepeat = 'repeat';div.style.zIndex = 9999;div.style.position = 'absolute';div.style.inset = 0;// 元素不會(huì)接收鼠標(biāo)事件,鼠標(biāo)事件會(huì)透過(guò)元素傳遞到下層的元素上div.style.pointerEvents = 'none';parentRef.value.appendChild(div);});// 防篡改處理let ob;onMounted(() => {ob = new MutationObserver((records) => {for (const record of records) {for (const dom of record.removedNodes) {if (dom === div) {flag.value++; // 刪除節(jié)點(diǎn)的時(shí)候更新依賴return;}}if (record.target === div) {flag.value++; // 修改屬性的時(shí)候更新依賴return;}}});ob.observe(parentRef.value, {childList: true,attributes: true,subtree: true,});});onUnmounted(() => {ob && ob.disconnect();div = null;});</script>

最后,在需要添加水印的頁(yè)面直接使用即可。QUt28資訊網(wǎng)——每日最新資訊28at.com

<template><water-mark><video src="@/assets/a.mp4" controls width="500" height="500"></video></water-mark></template><script setup>import WaterMark from "@/components/WaterMark.vue"</script>

3. 問(wèn)題詳解

(1)關(guān)于MutationObserver總結(jié)

MutationObserver 是 JavaScript 中的一個(gè)內(nèi)置對(duì)象,它提供了一種監(jiān)視 DOM(文檔對(duì)象模型)樹變化的能力。QUt28資訊網(wǎng)——每日最新資訊28at.com

MutationObserver 允許開發(fā)者注冊(cè)一個(gè)回調(diào)函數(shù),當(dāng)觀察的 DOM 節(jié)點(diǎn)或子節(jié)點(diǎn)發(fā)生變化時(shí),會(huì)觸發(fā)這個(gè)回調(diào)函數(shù)。這些變化可以包括節(jié)點(diǎn)的添加、移除、屬性的變化、文本內(nèi)容的改變等。QUt28資訊網(wǎng)——每日最新資訊28at.com

使用 MutationObserver 可以監(jiān)視特定的 DOM 元素或整個(gè)文檔,并在相關(guān)變化發(fā)生時(shí)執(zhí)行相應(yīng)的操作。這對(duì)于實(shí)時(shí)監(jiān)測(cè)頁(yè)面變化、自動(dòng)化測(cè)試、實(shí)現(xiàn)響應(yīng)式 UI 等場(chǎng)景非常有用。QUt28資訊網(wǎng)——每日最新資訊28at.com

下面是一個(gè)簡(jiǎn)單的示例,演示如何使用 MutationObserver 監(jiān)測(cè)某個(gè)元素的子節(jié)點(diǎn)變化:QUt28資訊網(wǎng)——每日最新資訊28at.com

// 目標(biāo)元素var targetElement = document.getElementById('target-element');// 創(chuàng)建一個(gè) MutationObserver 實(shí)例var observer = new MutationObserver(function(mutationsList, observer) {// 當(dāng)變化發(fā)生時(shí)執(zhí)行的回調(diào)函數(shù)for (var mutation of mutationsList) {if (mutation.type === 'childList') {console.log('子節(jié)點(diǎn)發(fā)生變化');console.log(mutation.addedNodes); // 添加的節(jié)點(diǎn)列表console.log(mutation.removedNodes); // 移除的節(jié)點(diǎn)列表}}});// 配置觀察選項(xiàng)var config = { childList: true };// 開始觀察目標(biāo)元素observer.observe(targetElement, config);

在上述示例中,我們首先通過(guò) getElementById 獲取目標(biāo)元素,然后創(chuàng)建一個(gè) MutationObserver 實(shí)例,傳入一個(gè)回調(diào)函數(shù)作為參數(shù)。回調(diào)函數(shù)會(huì)在目標(biāo)元素的子節(jié)點(diǎn)發(fā)生變化時(shí)被調(diào)用。我們可以在回調(diào)函數(shù)中根據(jù) mutationsList 的內(nèi)容進(jìn)行相應(yīng)的處理。在這個(gè)示例中,我們只關(guān)注子節(jié)點(diǎn)的變化,并打印相關(guān)信息到控制臺(tái)。QUt28資訊網(wǎng)——每日最新資訊28at.com

最后,我們通過(guò)調(diào)用 observe 方法來(lái)開始觀察目標(biāo)元素的變化。在 config 對(duì)象中,我們將 childList 屬性設(shè)置為 true,表示我們要監(jiān)測(cè)子節(jié)點(diǎn)的變化。QUt28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,MutationObserver 是一個(gè)異步的機(jī)制,它會(huì)在變化發(fā)生后才觸發(fā)回調(diào)函數(shù)。這意味著在開始觀察之前的變化可能不會(huì)被捕獲到。如果需要在開始觀察之前立即獲取當(dāng)前狀態(tài)的變化,可以在創(chuàng)建 MutationObserver 實(shí)例后,使用 observer.takeRecords() 方法來(lái)獲取當(dāng)前的變化記錄。QUt28資訊網(wǎng)——每日最新資訊28at.com

(2)關(guān)于pointer-events的總結(jié)

pointer-events 是一種 CSS 屬性,它控制元素對(duì)鼠標(biāo)事件的響應(yīng)方式。它可以設(shè)置在任何 HTML 元素上,并具有以下幾個(gè)可能的取值:QUt28資訊網(wǎng)——每日最新資訊28at.com

  • auto:元素對(duì)鼠標(biāo)事件作出默認(rèn)的響應(yīng)。即元素會(huì)根據(jù)自身的樣式和內(nèi)容對(duì)鼠標(biāo)事件做出適當(dāng)?shù)捻憫?yīng)。
  • none:元素對(duì)鼠標(biāo)事件不做出響應(yīng)。即元素不會(huì)接收鼠標(biāo)事件,鼠標(biāo)事件會(huì)透過(guò)元素傳遞到下層的元素上。這相當(dāng)于將元素變?yōu)椴豢牲c(diǎn)擊,即使它位于頁(yè)面上方或遮擋其他元素。
  • visiblePainted:元素對(duì)鼠標(biāo)事件做出響應(yīng),但鼠標(biāo)事件不會(huì)穿透元素,而是傳遞到下層的元素上。這意味著元素會(huì)接收鼠標(biāo)事件,但不會(huì)阻止下層元素對(duì)鼠標(biāo)事件的響應(yīng)。
  • visibleFill:元素對(duì)鼠標(biāo)事件做出響應(yīng),并會(huì)阻止鼠標(biāo)事件傳遞到下層的元素上。這意味著元素會(huì)完全接收鼠標(biāo)事件,并阻止下層元素對(duì)鼠標(biāo)事件的響應(yīng)。

pointer-events 屬性對(duì)于創(chuàng)建交互式的頁(yè)面元素非常有用,可以控制元素是否能夠接收和響應(yīng)鼠標(biāo)事件。通過(guò)將其設(shè)置為 none,可以使元素在外觀上可見(jiàn),但不會(huì)干擾下層元素的交互。QUt28資訊網(wǎng)——每日最新資訊28at.com

需要注意的是,pointer-events 屬性的兼容性有限,可能不支持所有瀏覽器或舊版本的瀏覽器。在使用時(shí),建議先檢查兼容性并提供備用方案或降級(jí)策略。QUt28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-77681-0.htmlVue3問(wèn)題:如何在頁(yè)面上添加水印?

聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。郵件:2376512515@qq.com

上一篇: 詳解基于SpringBoot的WebSocket應(yīng)用開發(fā)

下一篇: C# WinForm程序中讀寫INI配置文件的技術(shù)詳解

標(biāo)簽:
  • 熱門焦點(diǎn)
  • Mate60手機(jī)殼曝光 致敬自己的經(jīng)典設(shè)計(jì)

    8月3日消息,今天下午博主數(shù)碼閑聊站帶來(lái)了華為Mate60的第三方手機(jī)殼圖,可以讓我們?cè)谡鏅C(jī)發(fā)布之前看看這款華為全新旗艦的大致輪廓。從曝光的圖片看,Mate 60背后攝像頭面積依然
  • 6月安卓手機(jī)性能榜:vivo/iQOO霸占旗艦排行榜前三

    2023年上半年已經(jīng)正式過(guò)去了,我們也迎來(lái)了安兔兔V10版本,在新的驍龍8Gen3和天璣9300發(fā)布之前,性能榜的榜單大體會(huì)以驍龍8Gen2和天璣9200+為主,至于那顆3.36GHz的驍龍8Gen2領(lǐng)先
  • 服務(wù)存儲(chǔ)設(shè)計(jì)模式:Cache-Aside模式

    Cache-Aside模式一種常用的緩存方式,通常是把數(shù)據(jù)從主存儲(chǔ)加載到KV緩存中,加速后續(xù)的訪問(wèn)。在存在重復(fù)度的場(chǎng)景,Cache-Aside可以提升服務(wù)性能,降低底層存儲(chǔ)的壓力,缺點(diǎn)是緩存和底
  • K8S | Service服務(wù)發(fā)現(xiàn)

    一、背景在微服務(wù)架構(gòu)中,這里以開發(fā)環(huán)境「Dev」為基礎(chǔ)來(lái)描述,在K8S集群中通常會(huì)開放:路由網(wǎng)關(guān)、注冊(cè)中心、配置中心等相關(guān)服務(wù),可以被集群外部訪問(wèn);圖片對(duì)于測(cè)試「Tes」環(huán)境或者
  • Python異步IO編程的進(jìn)程/線程通信實(shí)現(xiàn)

    這篇文章再講3種方式,同時(shí)講4中進(jìn)程間通信的方式一、 Python 中線程間通信的實(shí)現(xiàn)方式共享變量共享變量是多個(gè)線程可以共同訪問(wèn)的變量。在Python中,可以使用threading模塊中的L
  • 雅柏威士忌多款單品價(jià)格大跌,泥煤頂流也不香了?

    來(lái)源 | 烈酒商業(yè)觀察編 | 肖海林今年以來(lái),威士忌市場(chǎng)開始出現(xiàn)了降溫跡象,越來(lái)越多不斷暴漲的網(wǎng)紅威士忌也開始悄然回歸市場(chǎng)理性。近日,LVMH集團(tuán)旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 機(jī)構(gòu)稱Q2國(guó)內(nèi)智能手機(jī)銷量同比下滑4% vivo份額重回第1

    7月29日消息,根據(jù)市場(chǎng)調(diào)查機(jī)構(gòu)Counterpoint Research公布的最新報(bào)告,2023年第2季度中國(guó)智能手機(jī)銷量同比下降4%,創(chuàng)新自2014年以來(lái)第2季度銷量新低。報(bào)
  • 2納米決戰(zhàn)2025

    集微網(wǎng)報(bào)道 從三強(qiáng)爭(zhēng)霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來(lái)。無(wú)論是老牌勁旅臺(tái)積電、三星,還是誓言重回先進(jìn)制程領(lǐng)先地位的英特爾,甚至初成立不久的新
  • 中關(guān)村論壇11月25日開幕,15位諾獎(jiǎng)級(jí)大咖將發(fā)表演講

    11月18日,記者從2022中關(guān)村論壇新聞發(fā)布會(huì)上獲悉,中關(guān)村論壇將于11月25至30日在京舉行。本屆中關(guān)村論壇由科學(xué)技術(shù)部、國(guó)家發(fā)展改革委、工業(yè)和信息化部、國(guó)務(wù)
Top