canvas实现页面水印

简介: canvas实现页面水印

在员工查看私密页面时,我们为了防止私密页面内容外泄,会在私密页面中打上当前查看人信息的水印,这样即使私密页面内容外泄了,也可以根据水印追究到具体责任人,接下来我们就采用前端的方式进行实现

页面结构

<div id="app">hello world</div>

样式

     * {
            margin: 0;
            padding: 0;
        }
        #app {
            width: 100vw;
            height: 100vh;
        }

结构和样式都比较简单,有个#app内容盒子,里面放的是我们的私密内容,我们让私密内容盒子铺满整个屏幕

逻辑实现

我们这里实现采用canvas进行实现,声明一个水印函数,水印函数接收一个config入参变量的配置对象(不传也有默认值),通过它配置我们canvas的水印效果,绘制出来后在将绘制的canvas导出成图片,新创建一个div元素在将canvas导出的图片以背景图的方式放到新创建的div元素中,给新创建div样式,使它能够完全贴合需要显示水印的元素,最后放到需要添加水印的容器中

     // 执行水印函数
            watermark()
        /**
         * @function 水印函数
         * @param  config {*}  水印配置文件
         * **/
        function watermark(config = {}) {
            // 开启水印盒子,默认是body元素
            let container = document.body;
            // 水印宽度
            let width = '150';
            // 水印高度
            let height = width / 3;
            // 水印字体水平居中样式(默认水平居中)
            let textAlign = "center";
            // 文字垂直对齐方式(默认中线对齐)
            let textVertical = "middle";
            // 字体大小(默认16px)
            let font = "16px serif";
            // 默认文字颜色
            let fillStyle = "rgba(204, 204, 204,0.5)";
            //   默认内容
            let content = "若水";
            // 默认旋转角度
            let rotate = "30";
            // 由于我们使用的是定位的方式,所以需要设置一下定位层级
            let posIndex = '10';
            // 是否显示时间(默认显示)
            let isTime = true;
            // 将默认配置和用户传递进来的配置进行合并
            let canvasConfig = Object.assign({ container, width, height, textAlign, textVertical, font, fillStyle, content, rotate, posIndex, isTime }, config);
            // 创建canvas元素
            const CANVAS = document.createElement('canvas');
            // 设置canvas的宽高
            CANVAS.style.cssText = `width:${canvasConfig.width}px;height = ${canvasConfig.height}px`;
            // 给canvas插入不支持提示内容
            CANVAS.innerText = '该浏览器不支持canvas元素,请更换其他浏览器重试!';
            // 判断浏览器是否支持canvas元素,不支持则不进入
            if (CANVAS.getContext) {
                // 获取绘制上下文
                const CANVASCONTENT = CANVAS.getContext('2d');
                // 设置文字水平位置
                CANVASCONTENT.textAlign = canvasConfig.textAlign;
                // 设置文字垂直位置
                CANVASCONTENT.textBaseline = canvasConfig.textVertical;
                // 设置文字样式
                CANVASCONTENT.font = canvasConfig.font;
                // 设置文字颜色
                CANVASCONTENT.fillStyle = canvasConfig.fillStyle;
                // 文字显示位置
                let textPosX = Math.trunc(canvasConfig.width) / 5;
                let textPosY = Math.trunc(canvasConfig.height) / 2;
                // 设置canvas平移位置
                CANVASCONTENT.translate(textPosX, textPosY);
                console.log(' 设置canvas平移位置', textPosX, textPosY);
                // 设置旋转角度
                CANVASCONTENT.rotate((-Math.trunc(canvasConfig.rotate) / 180) * Math.PI);
                // 进行绘制文本内容
                CANVASCONTENT.fillText(canvasConfig.content, textPosX, textPosY);
                // 判断是否需要添加事件水印
                if (isTime) {
                    // 获取当前时间
                    let currentTime = getCurrentTime();
                    // 添加时间内容
                    CANVASCONTENT.fillText(currentTime, textPosX, textPosY + 20);
                }
                // 将canvas导出成图片
                const Base64URL = CANVAS.toDataURL();
                // 创建一个div元素,用于存放水印图片
                const watermarkDOM = document.createElement('div');
                // 给创建的div元素设置样式
                /** position: absolute;
                     top: 0;
                      left: 0;
                      bottom: 0;
                      right: 0;
                    这样可以让元素水平垂直居中
                      **/
                // pointer-events: none;属性是让用户看的到但是鼠标点击不到,会直接穿透过去的效果
                const watermarkDOMStyle = `
                     position: absolute;
                      top: 0;
                      left: 0;
                      bottom: 0;
                      right: 0;
                      width: 100%;
                      height: 100%;
                      z-index: ${canvasConfig.posIndex};
                      pointer-events: none;
                      background: url('${Base64URL}');`;
                //   将样式添加给水印盒子
                watermarkDOM.style.cssText = watermarkDOMStyle;
                // 水印容器样式
                const containerStyle = `   
                 position: relative;
                 width: 100%;
                 min-width: 100%;
                 `;
                container.style.cssText = containerStyle;
                // 插入父节点
                container.appendChild(watermarkDOM);
            }
        }
        /**
         * @function 获取当前时间
         * **/
        function getCurrentTime() {
            // 当前时间
            let time = new Date();
            //    拼接的年月份格式
            let str = "年月日:";
            // 处理补零
            const getTime = str => {
                return str.toString().padStart(2, 0)
            }
            // 获取当前时间或者是传入的时间
            const T = time ? new Date(time) : new Date();
            // 获取年
            const Y = T.getFullYear()
            // 获取月
            const M = getTime(T.getMonth() + 1)
            // 获取日
            const D = getTime(T.getDate())
            // 获取时
            const H = getTime(T.getHours())
            // 获取分
            const B = getTime(T.getMinutes())
            // 将处理后的时间进行返回
            return `${Y}${str[0]}${M}${str[1]}${D}${str[2] && str[2] + ' '}${H}${str[3]}${B}`
        }

坚持努力,无惧未来!

相关文章
|
Web App开发 数据安全/隐私保护
解决input标签自动填充内容的问题
解决input标签自动填充内容的问题
|
数据安全/隐私保护
fiddler抓包-查看get与post请求参数
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/81566563 Fiddler抓包3-查看get与post请求 前言 前面两篇关于Fiddler抓包的一些基本配置,配置完之后就可以抓到我们想要的数据了,接下来就是如何去分析这些数据。
6992 0
|
消息中间件 JavaScript 小程序
SpringBoot 实现 MySQL 百万级数据量导出并避免 OOM 的解决方案
SpringBoot 实现 MySQL 百万级数据量导出并避免 OOM 的解决方案
|
3月前
|
弹性计算 运维 安全
公司注册阿里云账号全流程指南:所需材料、步骤拆解与常见问题解答
对于企业用户来说,注册阿里云账号并完成企业实名认证,是使用云服务器、数据库、短信服务等企业级云产品的前提。整个过程主要分为 “账号注册” 和 “企业实名认证” 两步,操作并不复杂,但需要提前准备好对应材料,避免因信息不全反复修改。本文结合最新的操作界面和规则,用通俗的语言拆解每一步流程,明确所需材料清单,同时解答注册过程中常见的问题,帮企业快速完成账号开通与认证。
|
JavaScript 前端开发 安全
80 行 JS 代码实现页面添加水印:文字水印、多行文字水印、图片水印、文字&图片水印
80 行 JS 代码实现页面添加水印:文字水印、多行文字水印、图片水印、文字&图片水印 1. 信息标识: 水印可以用于标识文档的所有者、保密级别、状态或其他相关信息,帮助用户更好地理解文档内容的属性。 2. 版权保护: 在文档中添加水印可以帮助保护内容的版权,防止他人未经授权地复制、转载或篡改内容。 3. 安全保护: 对于敏感信息或机密文档,添加水印可以帮助防止信息泄露,提高文档的安全性。 4. 提升专业性: 在一些场景下,如商业报告、合同文件等,添加水印可以增加文档的专业性和正式性。 5. 防止截屏或拷贝: 在网页中添加水印可以防止用户通过截屏或复制粘贴等方式非法获取文档内容。
562 1
80 行 JS 代码实现页面添加水印:文字水印、多行文字水印、图片水印、文字&图片水印
|
JavaScript 前端开发 容器
this、self、window、top 在 JavaScript 中的区别深入研究
在 JavaScript 开发中,`this`、`self`、`window` 和 `top` 是四个常用的概念。`this` 指向当前执行上下文的对象,其值取决于函数调用方式;`self` 在全局作用域中等同于 `window`,常用于 Web Workers;`window` 代表浏览器窗口,是全局变量的容器;`top` 指向最顶层窗口,用于判断是否在框架中。理解这些概念有助于编写健壮的代码。
435 1
this、self、window、top 在 JavaScript 中的区别深入研究
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
1386 22
|
Linux Shell 数据安全/隐私保护
Linux如何在服务器上进行密码的修改?
【10月更文挑战第6天】Linux如何在服务器上进行密码的修改?
2493 1
|
缓存 负载均衡 算法
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
Nginx 是一款高性能的 HTTP 和反向代理服务器,也是一个通用的 TCP/UDP 代理服务器,以及一个邮件代理服务器和通用的 HTTP 缓存服务器。
662 0
nginx学习:配置文件详解,负载均衡三种算法学习,上接nginx实操篇
|
存储 缓存 定位技术
ArcGIS Pro栅格数据批量预处理工具
ArcGIS Pro栅格数据批量预处理工具
2557 0

热门文章

最新文章