在系统开发过程中,一些数据或页面比较敏感的地方,客户会要求实现水印效果,防止内部人员截图或拍照泄露信息。

自定义文字水印顾名思义就是利用js在完成页面渲染的同时,往页面的最底层动态生成多个带水印信息的div

效果图如下:

这个解决方案在使用过程中不仅可以自定义水印内容,还可以自定义样式,如倾斜角angle、透明度opacity、字体fontFamily、字体大小fontsize、左右上下间隔等等。

其html内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>水印输出</title>
</head>
<body>
<div>
<h6>HELLO WORLD</h6>
<!-- 省略部分代码 -->
</div>
<!-- 引入js(路径根据项目情况确定) -->
<script type="text/javascript" src="watermark.js"></script>
<script>
// 自定义样式
const setting = {
"text": "测试水印", // 水印内容
"innerDate": true, // 在水印下方增加日期
"width": 110 // 水印宽度
};
// 渲染
watermark.build(setting);
</script>
</body>
</html>

自定义属性如下:

const setting = {
text: "广州坤硕授权", // 默认水印内容
beginX: 50, // 默认起始x坐标
endX: 0, // 默认结束x坐标
beginY: 50, // 默认起始y坐标
endY: 0, // 默认结束y坐标
intervalX: 150, // 默认横向间隔宽度
intervalY: 100, // 默认纵向间隔高度
opacity: 0.3, // 字体透明度
angle: 20, // 字体倾斜度
fontsize: '15px', // 字体大小
fontFamily: '微软雅黑', // 字体
width: 100, // 水印(每个)宽度
height: 80, // 水印(每个)高度
innerDate: false, // 是否附带日期
};

完整js如下:

/**
* 自定义文字水印
*/
const watermark = function () {
return {
build: function(arg) {
// 获取页面宽度
let maxWidth = Math.max(document.body.scrollWidth, window.screen.width) - 20;
// 获取页面高度
let maxHeight = Math.max(document.body.scrollHeight, document.body.clientHeight) + 100;
if (maxHeight === 0){
console.info("该页面无敏感内容~");
return;
}
const setting = {
text: "广州XX公司授权", // 默认水印内容
beginX: 50, // 默认起始x坐标
endX: 0, // 默认结束x坐标
beginY: 50, // 默认起始y坐标
endY: 0, // 默认结束y坐标
intervalX: 150, // 默认横向间隔宽度
intervalY: 100, // 默认纵向间隔高度
opacity: 0.3, // 字体透明度
angle: 20, // 字体倾斜度
fontsize: '15px', // 字体大小
fontFamily: '微软雅黑', // 字体
width: 100, // 水印(每个)宽度
height: 80, // 水印(每个)高度
innerDate: false, // 是否附带日期
};
// 默认变量与自定义变量结合
if (arguments.length ===1 && typeof arguments[0] === "object"){
const src = arguments[0] || {};
for (const key in src){
if (!src.hasOwnProperty(key) || !src[key]){
continue;
}
for (const def in setting){
if (key === def){
setting[def] = src[key];
}
}
}
}
// 计算列个数
const cols = parseInt((setting.intervalX + maxWidth - setting.beginX - setting.endX) / (setting.width + setting.intervalX) + "");
// 计算行个数
const rows = parseInt((setting.intervalY + maxHeight - setting.beginY - setting.endY) / (setting.height + setting.intervalY) + "");
// 水印内容附加日期
if (setting.innerDate){
const date = new Date();
setting.text = [setting.text, "<br>", date.getFullYear(), "年", date.getMonth() + 1, "月", date.getDate(), "日"].join("");
}
const fragment = document.createDocumentFragment();
let x, y;
for (let i=0; i<rows; i++){
y = setting.beginY + (setting.intervalY + setting.height) * i;
for (let j=0; j<cols; j++){
x = setting.beginX + (setting.width + setting.intervalX) * j;
const element = document.createElement('div');
element.id = 'watermark' + i + j;
// 设置倾斜角
element.style.MozTransform = "rotate(-" + setting.angle + "deg)";
element.style.msTransform = "rotate(-" + setting.angle + "deg)";
element.style.OTransform = "rotate(-" + setting.angle + "deg)";
element.style.transform = "rotate(-" + setting.angle + "deg)";
element.style.position = "absolute";
element.style.left = x + 'px';
element.style.top = y + 'px';
element.style.overflow = "hidden";
element.style.zIndex = "9999";
element.style.pointerEvents = 'none';
element.style.opacity = setting.opacity;
element.style.fontSize = setting.fontsize;
element.style.fontFamily = setting.fontFamily;
element.style.color = '#aaa';
element.style.textAlign = "center";
element.style.width = setting.width + 'px';
element.style.height = setting.height + 'px';
element.style.display = "block";
element.innerHTML = setting.text;
fragment.appendChild(element);
}
}
document.body.appendChild(fragment);
}
}
}();
  • 其中获取页面宽度去的是屏幕的分辨率window.screen.width考虑的是,当用户通过F12打开开发者工具并显示在左右两边时,此时刷新页面,通过document.body.clientHeight获取到的宽度是不包括开发者工具页面的宽度的,这时候水印就没有全部页面占满,那么用户关闭开发者工具时,并不会刷新页面重新生成水印,所以就会出现一边有水印而一遍没有,如此水印便失去了震慑能力,所以应该去屏幕分辨率较好。
  • 列的个数及行的个数是根据自定义或者默认的水印起始结束坐标、水印间隔宽高度、水印宽高度与页面的宽高度进行动态计算,也就是说我们可以通过印起始结束坐标、水印间隔宽高度、水印宽高度来控制水印的密集程度。
  • 此外,通过灵活设置起始坐标以及结束坐标可以设置仅仅在页面中的一小块区域出现水印,其他区域则不出现水印。
  • 函数的入参是一个json对象

html页面自定义文字水印效果案例的更多相关文章

  1. Java 给Word每一页设置不同文字水印效果

    Word中设置水印时,可预设的文字或自定义文字设置为水印效果,但通常添加水印效果时,会对所有页面都设置成统一效果,如果需要对每一页或者某个页面设置不同的水印效果,则可以参考本文中的方法.下面,将以Ja ...

  2. java创建透明背景的PNG图片加自定义文字水印

    人在码上走,需求天天有.这不,今天前端让我返回一个带自定义水印的背景图片.一通google,有现成的代码,但是基本是直接在源图上添加水印,生成出来的文字样式也没有控制好,看来又只有自己造轮子了. 过程 ...

  3. C# 给Word每一页设置不同文字水印

    Word中设置水印时,可预设的文字或自定义文字设置为水印效果,但通常添加水印效果时,会对所有页面都设置成统一效果,如果需要对每一页或者某个页面设置不同的水印效果,则可以参考本文中的方法.下面,将以C# ...

  4. java解决poi导出excel文字水印,导出excel不可操作问题

    首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...

  5. C# 处理PPT水印(二)——去除水印效果(文本水印、图片水印)

    本文将对C#处理PPT幻灯片中的水印进一步说明和介绍.在C# 处理PPT水印(一)一文中,分享了如何插入水印效果的方法,包括插入文字水印效果.插入图片作为水印效果两种情况,那对于不需要水印效果的情况, ...

  6. Salesforce 开发整理(十一) 自定义放大镜查找效果

    有时候在自定义的visualforce页面上,需要实现系统标准的查找样式,当不能使用标准的style的时候,我们只能选择自定义实现,下面分享一个demo,预览效果如下: 实现代码,Visualforc ...

  7. PHP实现水印效果(文字、图片)

    第一种 <?php /** * 功能:给一张图片加上水印效果 * $i 要加水印效果的图片 * $t 水印文字 * $size 文字大小 * $pos 水印的位置 * $color 文字的颜色 ...

  8. C# 处理PPT水印(一)——添加水印效果(文字水印、图片水印)

    对文档添加水印可以有效声明和保护文档,是保护重要文件的方式之一.在PPT文档中同样也可以设置水印,包括文本水印和图片水印,本文将讲述如何通过Spire.Presentation for .NET来对P ...

  9. 自定义View 水印布局 WaterMark 前景色 MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

随机推荐

  1. BGV上线17小时最高888.88美金,投资最高回报率近+1778倍, 带动NGK内存暴涨

    至12月3日BGV币上线A网交易所DeFi板块以来,BGV价值飙升长.,据非小号的数据显示,BGV币价是718美元(东八区时间2020年12月4日早上九点四十),相较昨日涨幅达70.14%,以718美 ...

  2. CodeMirror动态修改代码(关键: editor.getDoc().setValue(data); editor.refresh();)

    在使用codemirror时,其原理是根据form中的textarea标签,自动加载其内容,获得代码行的显示.(具体使用方式参见 codemirror官网使用手册 http://codemirror. ...

  3. WPF 如何修改button圆角(经典)

    本人想设置Button为圆角,奈何搜索百度,找到的全是坑爹答案,现总结如下: 1. 需要添加button 的template. 2. 设置border的时候,必须要设置background, 否则会提 ...

  4. JAVA 判断一个字符串是否是合法的日期格式?

    采用SimpleDateFormat类的parse方法进行判断,如果转换不成功,就会出现异常.另外,还需要判断字符串的长度,若不判断,第二个字符串就会验证通过,实际上也不是合法的.话不多说,且看代码: ...

  5. PVE更新WEB管理地址

    PVE也是一台Linux系统,如果PVE更换了网络环境,比如从家里拿到了办公室,那么就需要对其更新网络,才能让其它机器访问到它的8006管理地址. 具体做法是通过修改配置文件来更改IP. 更新网卡配置 ...

  6. Python切换版本工具pyenv

    目录 安装pyenv 安装与查看py版本 切换py版本 结合ide使用示例 和virtualenv的一些区别 参考文献 使用了一段时间,我发现这玩意根本不是什么神器,简直就是垃圾,安装多版本总是失败, ...

  7. Shell脚本控制docker容器启动顺序

    1.遇到的问题 在分布式项目部署的过程中,经常要求服务器重启之后,应用(包括数据库)能够自动恢复使用.虽然使用docker update --restart=always containerid能够让 ...

  8. 英语单词小程序插件 - EdictPlugin-LTS

    1.插件引入 全局app.json配置 "plugins": { "edict-plugin": { "version": "1. ...

  9. 选择 FreeBSD 而不是 Linux 的技术性原因4

    Linux 二进制兼容性 FreeBSD 提供了与 Linux 的二进制兼容.这使得用户可以在 FreeBSD 系统上安装和运行许多 Linux 二进制文件, 而无需首先修改二进制文件.在某些特定情况 ...

  10. 第三方API接口测试问题反馈文档

    大家在给甲方做大型项目的时候,有时候参与的厂商比较多,而公司负责的部分又需要第三方厂商提供接口支持. 例如我们做医疗行业的,给医院提供医保控费系统服务的,就需要HIS厂商提供接口给我们采集数据.有时候 ...