精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Vue3問題:如何在頁面上添加水印?

開發 前端
水印的添加不僅僅滿足于添加,有時候還要能防止用戶惡意篡改,時刻保證水印的功效。這次問題我分為了兩種情況:一種是僅添加水印僅可,另一種是添加水印且要防篡改。

1. 需求分析

為了防止網站信息被盜用,以及維護版權標識,常常需要在頁面、圖片或視頻上添加獨特水印,以作區分。

同時,水印的添加不僅僅滿足于添加,有時候還要能防止用戶惡意篡改,時刻保證水印的功效。

所以,這次問題我分為了兩種情況:一種是僅添加水印僅可,另一種是添加水印且要防篡改。

下面我將把實現一一列出。

2. 實現步驟

(1)僅添加水印情況

對于僅需要添加水印的情況,直接使用第三方UI庫中的水印組件即可,簡單快速。

當然,我們也可以選擇自己造輪子,用Canvas來畫,但是對于工作而言,我覺得這樣應該盡量避免。

這里我使用ElementPlus 2.4.0中,新出的Watermark水印組件作為例子。

實現代碼:

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

效果如下:

當然要注意的是,ElementPlus的依賴版本一定要是2.4.0之后的。

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

像ElementPlus提供的水印組件,是不支持防篡改功能的。

也就是說,如果有用戶通過瀏覽器的控制臺進行元素屬性的修改,是可以把頁面中的水印隱藏的。所以為了安全起見,是很需要做防篡改處理的。

為了保證自定義水印的靈活性,這里我使用了原生js的寫法,并且代碼參考了渡一官方大佬的文章。

簡言之,就是利用Canvas繪制水印圖像,以及利用MutationObserver對象來監聽Dom節點或其子節點的變化以實現防篡改處理。

代碼實現如下:

先寫一個hook函數useWatermarkBg,在其中用Canvas繪制水印圖像。

import { computed } from 'vue';
export default function useWatermarkBg (props) {
return computed(() => {
// 創建一個 canvas
const canvas = document.createElement('canvas');
const devicePixelRatio = window.devicePixelRatio || 1;
// 設置字體大小
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);
// 旋轉 45 度讓文字變傾斜
ctx.rotate((Math.PI / 180) * -45);
ctx.fillStyle = 'rgba(0, 0, 0, 0.3)';
ctx.font = font;
ctx.textAlign = 'center';
ctx.textBaseline = 'middle';
// 將文字畫出來
ctx.fillText(props.text, 0, 0);
return {
base64: canvas.toDataURL(),
size: canvasSize,
styleSize: canvasSize / devicePixelRatio,
};
});
}

再封裝一個水印公共組件WaterMark,在其中調用useWatermarkBg函數生成水印圖像,以及添加水印、做防篡改處理。

在mounted中,創建MutationObserver實例,監聽水印DOM節點的變化,在節點刪除或屬性修改時設置依賴,發出重新添加水印的通知。

在watchEffect中,進行收集依賴,只要依賴變化了,它就會重新添加水印圖像,達到防篡改效果。

值得一提的是,因為添加水印的原理是給頁面添加一個絕對定位的重復水印背景的div,但是,如果這樣我們就不能點擊div下層的元素了。

所以,這里還用了一個叫pointerEvents的css屬性,設置值為none,從而使元素不會接收鼠標事件,鼠標事件會透過元素傳遞到下層的元素上。

<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); // 聲明一個依賴
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;
// 元素不會接收鼠標事件,鼠標事件會透過元素傳遞到下層的元素上
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++; // 刪除節點的時候更新依賴
return;
}
}
if (record.target === div) {
flag.value++; // 修改屬性的時候更新依賴
return;
}
}
});
ob.observe(parentRef.value, {
childList: true,
attributes: true,
subtree: true,
});
});

onUnmounted(() => {
ob && ob.disconnect();
div = null;
});
</script>

最后,在需要添加水印的頁面直接使用即可。

<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. 問題詳解

(1)關于MutationObserver總結

MutationObserver 是 JavaScript 中的一個內置對象,它提供了一種監視 DOM(文檔對象模型)樹變化的能力。

MutationObserver 允許開發者注冊一個回調函數,當觀察的 DOM 節點或子節點發生變化時,會觸發這個回調函數。這些變化可以包括節點的添加、移除、屬性的變化、文本內容的改變等。

使用 MutationObserver 可以監視特定的 DOM 元素或整個文檔,并在相關變化發生時執行相應的操作。這對于實時監測頁面變化、自動化測試、實現響應式 UI 等場景非常有用。

下面是一個簡單的示例,演示如何使用 MutationObserver 監測某個元素的子節點變化:

// 目標元素
var targetElement = document.getElementById('target-element');

// 創建一個 MutationObserver 實例
var observer = new MutationObserver(function(mutationsList, observer) {
// 當變化發生時執行的回調函數
for (var mutation of mutationsList) {
if (mutation.type === 'childList') {
console.log('子節點發生變化');
console.log(mutation.addedNodes); // 添加的節點列表
console.log(mutation.removedNodes); // 移除的節點列表
}
}
});

// 配置觀察選項
var config = { childList: true };

// 開始觀察目標元素
observer.observe(targetElement, config);

在上述示例中,我們首先通過 getElementById 獲取目標元素,然后創建一個 MutationObserver 實例,傳入一個回調函數作為參數。回調函數會在目標元素的子節點發生變化時被調用。我們可以在回調函數中根據 mutationsList 的內容進行相應的處理。在這個示例中,我們只關注子節點的變化,并打印相關信息到控制臺。

最后,我們通過調用 observe 方法來開始觀察目標元素的變化。在 config 對象中,我們將 childList 屬性設置為 true,表示我們要監測子節點的變化。

需要注意的是,MutationObserver 是一個異步的機制,它會在變化發生后才觸發回調函數。這意味著在開始觀察之前的變化可能不會被捕獲到。如果需要在開始觀察之前立即獲取當前狀態的變化,可以在創建 MutationObserver 實例后,使用 observer.takeRecords() 方法來獲取當前的變化記錄。

(2)關于pointer-events的總結

pointer-events 是一種 CSS 屬性,它控制元素對鼠標事件的響應方式。它可以設置在任何 HTML 元素上,并具有以下幾個可能的取值:

  • auto:元素對鼠標事件作出默認的響應。即元素會根據自身的樣式和內容對鼠標事件做出適當的響應。
  • none:元素對鼠標事件不做出響應。即元素不會接收鼠標事件,鼠標事件會透過元素傳遞到下層的元素上。這相當于將元素變為不可點擊,即使它位于頁面上方或遮擋其他元素。
  • visiblePainted:元素對鼠標事件做出響應,但鼠標事件不會穿透元素,而是傳遞到下層的元素上。這意味著元素會接收鼠標事件,但不會阻止下層元素對鼠標事件的響應。
  • visibleFill:元素對鼠標事件做出響應,并會阻止鼠標事件傳遞到下層的元素上。這意味著元素會完全接收鼠標事件,并阻止下層元素對鼠標事件的響應。

pointer-events 屬性對于創建交互式的頁面元素非常有用,可以控制元素是否能夠接收和響應鼠標事件。通過將其設置為 none,可以使元素在外觀上可見,但不會干擾下層元素的交互。

需要注意的是,pointer-events 屬性的兼容性有限,可能不支持所有瀏覽器或舊版本的瀏覽器。在使用時,建議先檢查兼容性并提供備用方案或降級策略。

責任編輯:姜華 來源: 今日頭條
相關推薦

2024-02-01 09:10:04

頁面引導工具Vue3

2024-08-01 08:37:46

vue圖片性能

2022-05-04 18:26:25

PDF水印Python

2023-07-30 22:25:00

JavaScrip服務端Web

2023-11-28 09:03:59

Vue.jsJavaScript

2023-09-27 12:11:08

Python水印Pillow

2022-07-29 11:03:47

VueUni-app

2024-01-03 08:20:40

2024-01-23 09:15:33

Vue3組件拖拽組件內容編輯

2021-12-02 05:50:35

Vue3 插件Vue應用

2021-12-01 08:11:44

Vue3 插件Vue應用

2024-01-08 08:50:19

Vue3級聯菜單數據懶加載

2022-08-15 09:23:18

Uni-appVue-router

2023-12-18 09:58:46

微信掃碼支付Vue3

2023-11-20 08:29:33

Vue微信掃碼授權登錄

2021-11-30 08:19:43

Vue3 插件Vue應用

2024-11-06 10:16:22

2022-07-20 11:13:05

前端JSONVue3

2020-09-19 21:15:26

Composition

2024-02-27 08:27:18

元素拖拽Vue3拼圖驗證
點贊
收藏

51CTO技術棧公眾號

久久手机免费观看| 久久精品aⅴ无码中文字字幕重口| 少妇喷水在线观看| 亚洲麻豆av| 亚洲精品www久久久| 1024av视频| 91麻豆一区二区| 91精品国产91久久久久久黑人| 欧美一区二区久久| 亚洲 欧美 综合 另类 中字| 日本精品久久久久久| 国产日韩一区二区三区在线播放| 亚洲另类xxxx| 日本肉体xxxx裸体xxx免费| 精品国产白色丝袜高跟鞋| 国产一区二区三区日韩| 久久久欧美精品| 91精品国产自产| 久久亚洲资源中文字| 亚洲三级在线免费观看| 99久久精品无码一区二区毛片| 日本熟妇乱子伦xxxx| 精品国产不卡| 在线观看91精品国产麻豆| 97精品国产97久久久久久粉红| 无码国产伦一区二区三区视频| 老司机亚洲精品| 日韩性生活视频| 精品视频站长推荐| 亚洲精品乱码日韩| 亚洲成人免费视频| 亚洲午夜激情| 天堂av资源网| 国产在线精品免费| 欧美一级视频免费在线观看| 国产第一页浮力| 精品三级av在线导航| 欧美日韩的一区二区| 国产一二三在线视频| 91xxx在线观看| 成人一区二区三区视频在线观看 | 欧美激情亚洲另类| 99久久精品免费视频| 一级毛片精品毛片| 欧美性大战久久久久久久蜜臀 | 欧美黑人xxxx| 中文字幕黄色网址| 欧美精品中文字幕亚洲专区| 777亚洲妇女| 97在线免费公开视频| 手机av免费在线| 国产精品久久久久影院亚瑟| 蜜桃视频在线观看91| 亚洲AV无码精品国产| 久久国产婷婷国产香蕉| 欧美在线视频一区二区| 久久精品欧美一区二区| 在线精品小视频| 这里只有精品视频在线| 欧美日韩高清丝袜| 欧美中文一区| 精品久久久久香蕉网| 97超碰成人在线| 国产精品av一区二区三区 | 日韩精品国内| 丝袜+亚洲+另类+欧美+变态| 99视频精品在线| 国产精品免费视频一区二区| 精品人妻无码一区二区色欲产成人 | 91成人免费在线观看| 97人妻精品一区二区三区动漫| 日本视频一区二区| 78m国产成人精品视频| 精品无码人妻一区二区三区| 亚洲不卡av不卡一区二区| 尤物yw午夜国产精品视频明星| 50一60岁老妇女毛片| 91精品尤物| 欧美性jizz18性欧美| 国产精品网站免费| 黄页在线观看免费| 亚洲一线二线三线视频| 手机成人av在线| 中文日本在线观看| 欧美韩日一区二区三区| 少妇特黄a一区二区三区 | 久久xxxx| 国产suv精品一区二区| 国产农村妇女aaaaa视频| 在线精品亚洲| 欧美精品免费播放| 国产精品成人久久| 影音先锋一区| 午夜欧美大片免费观看| 国产无遮挡又黄又爽在线观看| 欧美人成在线| 久久久久久久一| 91在线看视频| 中日韩视频在线观看| 97在线看免费观看视频在线观看| 日本一二三区不卡| 国产农村妇女精品一二区| 欧美亚洲激情在线| 日韩黄色a级片| 日韩电影在线观看一区| 国产免费一区二区三区香蕉精| 亚洲一区二区天堂| 国产精品一二三| 99re在线观看视频| 亚洲精品97久久中文字幕| 成人午夜在线免费| 欧美日韩国产不卡在线看| seseavlu视频在线| 亚洲少妇中出一区| 久久国产精品网| 黄色软件视频在线观看| 欧美中文字幕亚洲一区二区va在线| 天堂av在线网站| 91精品亚洲一区在线观看| 欧美一二三区精品| 欧美精品黑人猛交高潮| 欧美日韩伦理| 欧美久久精品午夜青青大伊人| 青青草原免费观看| 美女黄网久久| 亚洲一区二区三区成人在线视频精品| 丰满岳乱妇国产精品一区| 久久女同性恋中文字幕| 亚洲欧洲免费无码| 色在线中文字幕| 欧美日韩激情在线| 精品国产一区在线| 99re久久最新地址获取| 欧美激情一区二区三区高清视频 | 成人激情小说网站| 亚洲在线不卡| 涩涩网在线视频| 精品视频资源站| 国产国语老龄妇女a片| 欧美自拍偷拍| 97在线观看免费高清| 国产一区二区三区中文字幕| 99国产精品久久久久久久久久久| 四虎永久国产精品| 亚洲欧洲日本韩国| 日韩你懂的在线观看| 一级黄色片网址| 精品动漫3d一区二区三区免费| 国产精品精品国产| 亚洲欧洲精品视频| 一区二区三区四区精品在线视频| 免费观看成人网| 激情小说亚洲色图| 久久天堂电影网| 无码人妻一区二区三区线| 99热精品国产| 91免费国产精品| 欧美日韩女优| 亚洲精品一区二区网址| 国产一级aa大片毛片| 久久99精品国产麻豆不卡| 欧美日韩精品久久| 韩国精品一区| 精品国产乱子伦一区| 国产在线免费看| 99riav国产精品| 91在线短视频| 欧美黑人激情| 欧美日韩国产小视频在线观看| 三级电影在线看| 亚洲精品人人| 国产精成人品localhost| 日本黄色片在线观看| 欧美三级三级三级爽爽爽| 久久久久久国产精品无码| 一本久道久久综合婷婷鲸鱼| 国产成人亚洲欧美| 国产不卡在线| 欧美一级xxx| 欧美黄色免费观看| 福利视频网站一区二区三区| 黄色影视在线观看| 免费一区二区三区在线视频| 日韩在线视频网站| 亚洲资源在线播放| 国产精品国产三级国产| 日本黄色福利视频| 第一sis亚洲原创| 成人h视频在线| 国产在线观看免费麻豆| 欧美一级片在线看| 免费无遮挡无码永久在线观看视频| 国产剧情在线观看一区二区| 免费日韩在线观看| 国产精伦一区二区三区| 亚洲18私人小影院| 邻家有女韩剧在线观看国语| 欧美性xxxxx极品娇小| 中文字幕免费高清视频| 西西人体一区二区| 色综合电影网| 9999精品| 欧美激情精品久久久久| 污视频网站免费观看| 日韩欧美在线视频免费观看| 在哪里可以看毛片| 麻豆精品网站| 五月天亚洲综合情| 91精品麻豆| 97精品久久久中文字幕免费| 噜噜噜在线观看播放视频| 欧美日韩亚洲国产综合| 欧美精品入口蜜桃| 91蜜桃网址入口| 岛国av在线免费| 好吊日精品视频| 国产精品亚洲一区| 国产日韩电影| 久久精品国产亚洲7777| 日本韩国免费观看| 欧美日韩精品一区二区| 九九九在线视频| 久久奇米777| 一级做a爱视频| 男女精品网站| 中文字幕乱码免费| 天堂av一区二区三区在线播放| 91在线精品播放| 老色鬼在线视频| 在线一区二区日韩| 无码国产精品一区二区色情男同 | 无码视频一区二区三区| 亚洲日本护士毛茸茸| 三级电影在线看| 日韩电影在线看| 国产手机免费视频| 日韩中文首页| 精品免费二区三区三区高中清不卡| 国产国产一区| 97免费在线视频| 国产理论在线观看| 国产一区二区三区视频免费| 亚洲狼人综合网| 欧美亚洲一区三区| 天天干在线播放| 亚洲韩国一区二区三区| 四虎影视一区二区| 久久亚区不卡日本| 女女调教被c哭捆绑喷水百合| 欧美aⅴ一区二区三区视频| 国产二区视频在线| 久久国产亚洲精品| 亚州欧美一区三区三区在线| 国产三级精品三级在线观看国产| 成人高清视频观看www| 欧美日韩视频网站| 日本亚洲欧美三级| 国产免费拔擦拔擦8x在线播放 | 日韩一级成人av| 中文字幕一区二区三区四区免费看| 精品高清一区二区三区| 久久精品国产亚洲av高清色欲 | 女同久久另类69精品国产| 久久久久久久久久久电影| 欧美xxxxx精品| 国产成人av福利| 思思久久精品视频| 日韩中文字幕一区二区三区| av网站手机在线观看| 一本一本久久| 欧美精品久久久久久久久久久| 国产精品www.| 中文字幕日韩精品无码内射| 亚洲欧美综合久久久| 一区二区不卡视频| 成人3d精品动漫精品一二三| 欧美尤物一区| 国产成人1区| 欧美中日韩一区二区三区| 自拍亚洲一区| 美媛馆国产精品一区二区| 色狠狠久久av综合| 久久婷婷开心| 婷婷精品在线观看| 欧美国产二区| 国产99久久| 日韩精品极品视频在线观看免费| 欧美日韩中文字幕一区二区三区 | 国产美女主播在线播放| 亚洲三级色网| 国产白丝袜美女久久久久| 在线成人国产| 男人女人黄一级| 麻豆成人综合网| 色综合五月婷婷| 国产一二精品视频| 亚洲乱妇老熟女爽到高潮的片| 波多野结衣一区二区三区 | 亚洲欧美成人影院| 欧美极品第一页| 国产精品25p| 国产成人短视频| 久久毛片亚洲| 国产欧美日韩中文字幕| 欧美电影在线观看一区| 国产精品一区二区三区四区五区| 免费看久久久| 日韩三级电影免费观看| 久久资源中文字幕| 日本aa在线观看| 日日骚欧美日韩| 亚洲综合av在线播放| 国产成人av影院| 国精产品一区一区三区免费视频| 日本一区二区三级电影在线观看| 日韩一区二区不卡视频| 午夜伊人狠狠久久| 日韩免费av网站| 欧美日韩亚洲国产综合| 深爱激情五月婷婷| 中文字幕9999| 伊人影院蕉久影院在线播放| 2021久久精品国产99国产精品| 国产精品无码久久久久| 99在线视频免费观看| 亚洲婷婷伊人| 99久久99久久精品| 视频一区二区国产| 国产欧美视频一区| 国产午夜一区二区三区| 青青草原国产视频| 在线观看日产精品| 国产女人高潮的av毛片| 亚洲人成电影在线观看天堂色| av网站大全在线| 欧美一级黄色网| 秋霞影院一区| 日韩免费一区二区三区| 韩国一区二区三区在线观看| 国产精品久久a| 成人av资源站| www色aa色aawww| 欧洲视频一区二区| 人妻91麻豆一区二区三区| 精品国产欧美一区二区五十路| 男人的天堂免费在线视频| 国产日韩欧美中文| 国产免费av一区二区三区| 国产精品12345| 精品一区二区三区影院在线午夜 | 色婷婷亚洲一区二区三区| 国产福利资源在线| 亚洲午夜精品久久久久久久久久久久| 福利小视频在线| 亚洲在线一区二区| 成人免费电影网址| 日韩精品无码一区二区三区免费| 懂色av一区二区三区免费观看| 亚洲一二三四五六区| 色综合天天综合在线视频| 日本亚洲欧美| 性色av一区二区三区免费| 91免费精品国偷自产在线在线| 久久久成人精品一区二区三区| 精品在线亚洲视频| 黄色av片三级三级三级免费看| 色悠久久久久综合欧美99| 香蕉视频911| 日韩免费av一区二区| 久久91成人| 簧片在线免费看| 国产欧美视频在线观看| 懂色av蜜臀av粉嫩av喷吹| 亚洲欧洲视频在线| 免费日韩成人| 午夜精品电影在线观看| 精品一区二区在线免费观看| 国产在线免费看| 欧美不卡在线视频| 欧美1—12sexvideos| 国产精品自拍首页| 亚洲一级网站| 超碰男人的天堂| 日韩欧美在线国产| 都市激情一区| 国产在线拍偷自揄拍精品| 国产精品7m凸凹视频分类| www.超碰97.com| 亚洲三级电影全部在线观看高清| 日韩欧美视频一区二区| 成人啊v在线| 日韩精品最新在线观看| 理论电影国产精品| 亚洲综合视频网站| 亚洲第一男人天堂| 另类专区亚洲| 亚洲欧美日产图| 国产精品白丝av| 日本视频www| 三级精品视频久久久久|