Vue前端添加水印功能

文章目录

    • 概要
    • 技术细节
    • 附上几张调整的结果图

概要

前端Vue在页面添加水印,且不影响页面其他功能使用,初级代码水准即可使用,且有防人修改或者删除功能!

提示:适用于Vue,组件已经封装开箱即用,有对应配置项!

技术细节

  1. 需要展示水印的界面这里以demo.vue为例 引入核心文件(组件) waterMask.vue直接复制粘贴即可
// watermask类名不能省略, 此类名组件有检测,即使人为删除也会重新创建,提高安全性
<template><div class="watermask"><water-mask></water-mask></div>
</template>
<script>
import waterMask from './waterMark.vue';	// 文件在同级下
export default {components: {waterMask},
}
</script>
  1. 引入核心文件(组件) waterMask.vue,和 demo.vue 位于同级下,所有的属性修改都在 data=>initProps下 不用在意怎么实现,直接复制粘贴即可,做一个合格的CV工程师
<template><div class="_waterMask"></div>
</template>
<script>
export default {props: {//是否允许通过js或者开发者工具等途径修改水印DOM节点(水印的id,attribute属性,节点的删除)//true为允许,默认不允许inputAllowDele: {type: Boolean,default: false},//是否在销毁组件时去除水印节点(前提是允许用户修改DOM,否则去除后会再次自动生成)// true会,默认不会inputDestroy: {type: Boolean,default: false}},data() {return {drawer: true,maskDiv: {}, //当前显示的水印div节点DOM对象initProps: {inputText: "超级管理员",               //显示的水印文本width: "300",               // 单个水印的宽度height: "230",               // 单个水印的宽度fillStyle: 'rgb(112, 113, 114, 0.2)',    // 水印颜色rotateNumber: 40,                  // 旋转角度zIndex: "3000",              // 水印的层级}}},mounted() {//确认DOM渲染后再执行this.$nextTick(() => {//创建水印节点this.init()if (!this.inputAllowDele) {// 设置水印节点修改的DOM事件this.Monitor()}})},methods: {init() {let canvas = document.createElement('canvas')canvas.id = 'canvas'canvas.width = this.initProps.width  //单个水印的宽高canvas.height = this.initProps.heightthis.maskDiv = document.createElement('div')let ctx = canvas.getContext('2d')ctx.font = 'normal 18px Microsoft Yahei' //设置样式ctx.fillStyle = this.initProps.fillStyle //水印字体颜色       ctx.rotate(this.initProps.rotateNumber * Math.PI / 180) //水印偏转角度//  第二个参数 下移 的参数ctx.fillText(this.initProps.inputText, 70, 20);let src = canvas.toDataURL('image/png')this.maskDiv.style.position = 'fixed'this.maskDiv.style.zIndex = this.initProps.zIndex //  水印的层级this.maskDiv.id = '_waterMark'this.maskDiv.style.top = '80px'this.maskDiv.style.left = '480px'this.maskDiv.style.width = '80%'this.maskDiv.style.height = '100%'this.maskDiv.style.pointerEvents = 'none'this.maskDiv.style.backgroundImage = 'URL(' + src + ')'document.getElementsByClassName('watermask')[0].appendChild(this.maskDiv);// 水印节点插到body下// document.body.appendChild(this.maskDiv)},Monitor() {let body = document.getElementsByClassName('watermask')[0]// let body = document.getElementsByTagName('body')[0]let options = {childList: true,attributes: true,characterData: true,subtree: true,attributeOldValue: true,characterDataOldValue: true}let observer = new MutationObserver(this.callback)observer.observe(body, options)  //监听父节点, 强制删除则重新创建},//DOM改变执行callbackcallback(mutations, observer) {//当attribute属性被修改if (mutations[0].target.id === '_waterMark') {this.removeMaskDiv()}//当id被改变时if (mutations[0].attributeName === 'id') {this.removeMaskDiv()this.init()}//当节点被删除if (mutations[0].removedNodes[0] && mutations[0].removedNodes[0].id === '_waterMark') {this.init()}},/* public *///手动销毁水印DOMremoveMaskDiv() {// document.body.removeChild(this.maskDiv)document.getElementsByClassName('watermask')[0].removeChild(this.maskDiv)},//手动生成水印createMaskDiv() {this.init()}},watch: {//监听传入水印文本变化inputText() {this.$nextTick(() => {this.removeMaskDiv()})}},destroy() {//组件销毁时去除生成在body节点下的水印节点if (this.inputDestroy) {this.removeMaskDiv()}}
}
</script><style lang="less">
._waterMask {#settingBtn {position: absolute;bottom: 20px;right: 0;font-size: 35px;}
}
</style>

附上几张调整的结果图

  1. 灰色 0.2 透明度
    在这里插入图片描述
  2. 红色 0.1 透明度
    在这里插入图片描述
  3. 调整密度
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/146356.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rpmbuild 包名 version 操作系统信息部分来源 /etc/rpm/macros.dist

/etc/rpm/macros.dist openeuler bclinux src.rpm openssl-1.1.1f-13.oe1.src.rpm 打包名称结果 openeuler openssl-1.1.1f-13.aarch64.rpm bclinux openssl-1.1.1f-13.oe1.bclinux.aarch64.rpm 验证 修改openeuler配置文件macros.dist 重新在openeuler上执行rpmbuild…

2.4 矩阵的运算法则

矩阵是数字或 “元素” 的矩形阵列。当矩阵 A A A 有 m m m 行 n n n 列&#xff0c;则是一个 m n m\times n mn 的矩阵。如果矩阵的形状相同&#xff0c;则它们可以相加。矩阵也可以乘上任意常数 c c c。以下是 A B AB AB 和 2 A 2A 2A 的例子&#xff0c;它们都是 …

【算法】距离(最近公共祖先节点)

题目 给出 n 个点的一棵树&#xff0c;多次询问两点之间的最短距离。 注意&#xff1a; 边是无向的。所有节点的编号是 1,2,…,n。 输入格式 第一行为两个整数 n 和 m。n 表示点数&#xff0c;m 表示询问次数&#xff1b; 下来 n−1 行&#xff0c;每行三个整数 x,y,k&am…

【Flink】Flink任务缺失Jobmanager日志的问题排查

Flink任务缺失Jobmanager日志的问题排查 问题不是大问题&#xff0c;不是什么代码级别的高深问题&#xff0c;也没有影响任务运行&#xff0c;纯粹因为人员粗心导致&#xff0c;记录一下排查的过程。 问题描述 一个生产环境的奇怪问题&#xff0c;环境是flink1.15.0 on yarn…

Apache Airflow (十) :SSHOperator及调度远程Shell脚本

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

【C++】【Opencv】cv::GaussianBlur、cv::filter2D()函数详解和示例

本文通过函数详解和运行示例对cv::GaussianBlur和cv::filter2D()两个函数进行解读&#xff0c;最后综合了两个函数的关系和区别&#xff0c;以帮助大家理解和使用。 目录 cv::GaussianBlur&#xff08;&#xff09;函数详解运行示例 filter2D()函数详解运行示例 总结两个函数联…

github 私人仓库clone的问题

github 私人仓库clone的问题 公共仓库直接克隆就可以&#xff0c;私人仓库需要权限验证&#xff0c;要先申请token 1、登录到github&#xff0c;点击setting 打开的页面最底下&#xff0c;有一个developer setting 这里申请到token之后&#xff0c;注意要保存起来&#xff…

ke11..--2其他界面也要提取我的locatStarage

获取浏览器里面的本地缓存 localStorage就是我们的浏览器缓存在哪都可以用 下面代码是获取打印到我们的页面上 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Title</title> </head> …

计算机网络八股文

计算机网络八股文 第一章 计算机网络基础 1.1 OSI 七层参考模型及各自功能 七层参考模式是一个抽象的模型体&#xff0c;不仅包括一系列抽象的术语或概念&#xff0c;也包括具体的协议。 &#xff08;物、数、网、传、会、表、应&#xff09; 物理层&#xff1a;主要定义物…

PyCharm 【unsupported Python 3.1】

PyCharm2020.1版本&#xff0c;当添加虚拟环境发生异常&#xff1a; 原因&#xff1a;Pycharm版本低了&#xff01;不支持配置的虚拟环境版本 解决&#xff1a;下载PyCharm2021.1版本&#xff0c;进行配置成功&#xff01;

nginx学习(2)

Nginx 反向代理案例2 1. 实现效果 实现效果&#xff1a;使用 nginx 反向代理&#xff0c;根据访问的路径跳转到不同端口的服务中 nginx 监听端口为 8001&#xff0c; 访问 http://127.0.0.1:8001/edu/ 直接跳转到 127.0.0.1:8081 访问 http://127.0.0.1:8001/vod/ 直接跳转到 …

【开源】基于JAVA的大学兼职教师管理系统

项目编号&#xff1a; S 004 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S004&#xff0c;文末获取源码。} 项目编号&#xff1a;S004&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容三、界面展示3.1 登录注册3.2 学生教师管…

MATLAB 机械臂逆运动学进行轨迹控制建模

系列文章目录 文章目录 系列文章目录前言一、模型概览1.1 Target Pose Generation 目标姿势生成1.2 Inverse Kinematics 逆运动学1.3 Manipulator Dynamics 机械手动力学1.4 Pose Measurement 姿势测量 二、机械手定义三、生成航点四、模型设置五、模拟机械手运动六、将结果可视…

OpenCV快速入门:初探

文章目录 一、什么是OpenCV二、安装OpenCV三、图像读取与显示读取图像显示图像等待按键与关闭窗口 四、视频加载与摄像头调用从视频文件中读取从摄像头中读取关闭窗口与释放资源 五、图像的基本存储方式RGB矩阵矩阵操作与像素访问使用矩阵来显示图像 六、图像保存读取图像保存图…

java接收前端easyui datagrid传递的数组参数

这篇文章分享一下怎么在easyui的datagrid刷新表格时&#xff0c;在后端java代码中接收datagrid传递的数组参数。 数组来源于技能的tagbox&#xff08;标签框&#xff09;&#xff0c;tagbox和combobox的区别是tagbox可以选择多项。 标签框渲染的代码为 $("#skill_ids"…

wpf devexpress Property Gird管理集合属性

Property Grid允许你添加&#xff0c;浏览和编辑集合属性

golang标准库-crc32的使用

1.概述 crc32实现了32位循环冗余检测算法的实现。目前crc32内部提供 了三种常用的多项式,采用查表法来提高计算checksum的效率。通过crc32.MakeTable()可以获取对应的表&#xff0c;crc32提供了一个IEETABLE可以直接使用&#xff0c;官方链接如下&#xff1a;crc32 package - h…

Windows Server2012 R2修复SSL/TLS漏洞(CVE-2016-2183)

漏洞描述 CVE-2016-2183 是一个TLS加密套件缺陷&#xff0c;存在于OpenSSL库中。该缺陷在于使用了弱随机数生成器&#xff0c;攻击者可以利用此缺陷预测随机数的值&#xff0c;从而成功绕过SSL/TLS连接的加密措施&#xff0c;实现中间人攻击。这个漏洞影响了OpenSSL 1.0.2版本…

免费开源的区域屏幕录制(gif转换)工具(支持编辑功能)

软件优点&#xff1a;区域截屏&#xff0c;直接转换为gif即刻分享&#xff0c;免费开源&#xff0c;支持编辑功能 它可以让你轻松地录制屏幕&#xff0c;摄像头或画板的动画&#xff0c;并编辑、保存为 GIF&#xff0c;视频或其他格式。 下载并安装 ScreenToGif 首先&#xf…

CentOS中安装常用环境

一、CentOS安装 redis ①&#xff1a;更新yum sudo yum update②&#xff1a;安装 EPEL 存储库 Redis 通常位于 EPEL 存储库中。运行以下命令安装 EPEL 存储库 sudo yum install epel-release③&#xff1a;安装 Redis sudo yum install redis④&#xff1a;启动 Redis 服…