【功能模块】-- 水印

news2024/11/23 15:14:35

目录

 👊🏻实现思路

创建canvas

创建div并添加canvas

将div加入document中

具体实现

创建canvas

创建div并添加canvas

将div加入document中

总结

很多时候,我们会遇到各种各样的需求。今天我们来讲讲水印的实现方式,通俗易懂,拎包即用!

 👊🏻实现思路

  • 创建canvas

对canvas感兴趣的,可以看我这一系列文章
你真的了解Canvas吗--解密一【ZRender篇】
你真的了解Canvas吗--解密二【ZRender篇】等等,我就不一一罗列了,占字数~

  • 创建div并添加canvas

一个最高层脱离文档流的div并添加canvas

  • 将div加入document中

具体实现

  • 创建canvas
const createCanvas = () => {
  const can = document.createElement("canvas"); 
  can.width = 300;
  can.height = 180;
  const ctx = can.getContext("2d"); 
  ctx.rotate((-30 * Math.PI) / 180); //旋转角度
  ctx.font = "15px Vedana"; 
  ctx.fillStyle = "#666666"; 
  ctx.textAlign = "center"; 
  ctx.textBaseline = "Middle"; 
  ctx.fillText(loginName, can.width / 2, can.height);
  ctx.fillText(time, can.width / 2, can.height + 22); 

  return can;
}
  • 创建div并添加canvas
const createTopDiv = (id, can) => {
  const div = document.createElement("div");
  div.id = id;
  div.style.pointerEvents = "none"; // 不再监听当前图层的鼠标事件,而去监听下一层中元素的鼠标事件(穿透)
  div.style.top = "40px";
  div.style.left = "0px";
  div.style.opacity = "0.15";
  div.style.position = "fixed";
  div.style.zIndex = "100000";
  div.style.width = document.documentElement.clientWidth + "px";
  div.style.height = document.documentElement.clientHeight + "px";
  div.style.background =
    "url(" + can.toDataURL("image/png") + ") left top repeat";

  return div;
}
  1. 放最上层就是要保证水印的效果 
  2. 使用css3的pointerEvents = “none”透传特性
  3. 设置background属性为"url(" + can.toDataURL("image/png") + ") left top repeat"
  • 将div加入document中
const setWatermark = () => {
  let id = waterId;
  if (document.getElementById(id) != null) {
    document.body.removeChild(document.getElementById(id));
  } 
  //创建一个画布
  const can = createCanvas();
  //创建一个最高层脱离文档流的div
  const div = createTopDiv(id, can);
  //加入document中
  document.body.appendChild(div);
  return id;
};

这里面的waterId大家可以设置的复杂一点,防止重复

总结

好了,水印功能完工,是不是通俗易懂。有问题可以给我留言哦! 

我把对应的代码也上传了,想看源码的可以去翻找一下!!!

如果觉得有收获,麻烦给个赞和关注。你的鼓励是我写作的动力,大家一起学习一起进步。

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

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

相关文章

镭速助力解决企业大文件传输难题

在数字化时代,数据已成为企业的核心资产。无论是高清视频、大规模数据库备份还是复杂的3D设计文件,企业每天都要处理大量数据。然而,在享受数据带来的便利和价值的同时,企业也面临着一个现实问题——如何高效、安全地传输大文件&a…

Spring框架 - 下篇

预备知识:MyBatis Spring框架-上篇 文章目录 注解开发注解开发定义bean纯注解开发bean管理bean作用范围、生命周期 依赖注入自动装配加载properties文件 第三方bean第三方bean管理第三方bean依赖注入 总结 Spring整合MyBatis小结 整合junitAOPAOP简介AOP核心概念A…

穷人就不该乱买电车

文 | AUTO芯球 作者 | 雷慢 买车最怕的是什么你知道吗? 是没钱的穷人还要去买豪华电车, 比买电车更可怕的是什么你知道吗? 是买了电车没两年又卖了! 真不是讲鬼故事, 新能源车尤其是纯电车,一年打五折…

压缩包格式详解:RAR、ZIP、7z等格式的优劣与使用场景

随着数字信息的迅猛增长,文件压缩已成为日常生活和工作中的必要操作。通过压缩技术,文件可以被减小体积,便于传输和存储。 目前,市面上常见的压缩格式有 RAR、ZIP 和 7z 等,不同的压缩格式在效率、兼容性和功能方面各…

FFmpeg 简介及其下载安装步骤

目录 一、FFmpeg 简介 二、FFmpeg 安装步骤 2.1 打开官网 2.2 选择FFmpeg系统版本 2.3 下载FFmpeg压缩包 2.4 将下载好的压缩包进行解压 2.5 设置环境变量 2.5.1 在搜索栏中搜索【环境变量】,然后单击将其打开 2.5.2 找到系统变量中的【Path】,点…

实景三维赋能地下管线综合智管应用

在现代城市基础设施管理中,地下管线作为城市的生命线,其安全、高效的管理至关重要。随着实景三维技术的快速发展,地下管线管理迎来了新的发展机遇。本文将探讨实景三维技术如何赋能地下管线的综合智管应用。 一、地下管线管理面临的挑战 地…

Qt_软件添加版本信息

文章内容: 给生成的软件添加软件的版权等信息 #include <windows.h> //中文的话增加下面这一行 #pragma code_page(65001)VS_VERSION_INFO VERSIONINFO

java遍历数组填充排序

java数组 遍历数组 for循环 遍历二维数组 小案例 // 定义一个包名为nb package nb;// 定义一个名为ErWei的公共类 public class ErWei {// 主方法&#xff0c;程序的入口点public static void main(String[] args) {// 声明并初始化一个二维数组a&#xff0c;其中包含三个一…

jdbc连接数据库时 java.lang.RuntimeException错误解决

url中加入 useSSLfalse SSL(Secure Sockets Layer)&#xff0c;安全套接字协议。 在连接mysql时&#xff0c; 如果MySQL的版本为5.7以上时&#xff0c;必须加上useSSLfalse&#xff0c;直接通过用户账号和密码进行连接MySQL数据库&#xff1b;当MySQL的版本是5.7以下则不进行…

干部管理系统:全面提升干部管理效能

数字化浪潮下&#xff0c;干部管理系统作为管理利器&#xff0c;日益凸显其核心价值。该系统全面实现干部信息的数据化&#xff0c;涵盖从基础档案到教育、工作、培训及考核等全方位细节&#xff0c;信息详尽且条理清晰。这不仅极大提升了干部信息查询与更新的效率&#xff0c;…

中航资本:这个“舰队”猛攻!发生了什么?

今日早盘&#xff0c;A股商场动摇较大&#xff0c;但经过一段下挫之后&#xff0c;很快就被多头拉起。而从盘面来看&#xff0c;以代码601最初的大盘蓝筹股&#xff08;亦是高股息板块&#xff09;今日体现非常突发&#xff0c;盈利ETF大多涨幅在4%左右水平。那么&#xff0c;毕…

MR30系列IO——工业自动化的智慧纽带

一、引言 在工业自动化技术的广阔天地中&#xff0c;MR30系列IO模块、数字量模块以及模拟量模块构成了控制系统的核心基石。它们被广泛应用于可编程逻辑控制器&#xff08;PLC&#xff09;、分布式控制系统&#xff08;DCS&#xff09;等多种自动化系统中&#xff0c;为工业生…

安卓13屏蔽蓝牙匹配对话框 自动匹配 android13屏蔽蓝牙匹配对话框 自动匹配

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 蓝牙连接的时候,会有匹配对话框提示。我们来实现自动配对。 2.问题分析 这里我们是通过点击操作来实现功能的,所以我们思路可以是自动点击功能的实现。 3.代码分…

笔记||VUE3

侦听器 | Vue.js (vuejs.org) 模板引用 | Vue.js (vuejs.org)

Java 对接485协议数据基于jSerialComm库

Java 对接 485 协议数据的科普 一&#xff1a;引言 485协议&#xff0c;通常指的是RS-485&#xff0c;它是一种用于长距离通信的标准电气接入规范。由于其优越的抗干扰能力和较长的通信距离&#xff0c;RS-485在工业自动化、楼宇控制等领域得到了广泛应用。本篇文章将介绍如何…

基于Springboot+vue的漫画网站

一、系统架构 前端&#xff1a;vue | element-ui | html 后端&#xff1a;springboot | mybatis-plus 环境&#xff1a;jdk1.8 | mysql | maven | nodejs 二、代码及数据库 三、功能介绍 01. web端-首页1 02. web端-首页2 03. web端-登录 04. web端-注册 05. w…

免费分享:中国县级居民点

数据详情 1:100万中国县级居民点矢量数据 数据属性 数据名称&#xff1a;1:100万中国县级居民点矢量数据 数据时间&#xff1a;2010年之前 空间位置&#xff1a;全国 数据格式&#xff1a;Shp矢量 空间分辨率&#xff1a;- 坐标系&#xff1a;WGS1984 下载方法 打开数字…

5款人声分离免费软件分享,从入门到精通,伴奏提取分分钟拿捏!

人声分离通常是音乐制作、混音和卡拉OK中常用的重要技术之一。它的核心是将乐器伴奏从原始音轨中分离出来&#xff0c;使得用户可以单独处理或重混音频&#xff0c;创造出清晰干净的伴奏轨道。若缺乏强大的音频剪辑软件或专业人声分离工具&#xff0c;这一过程往往会比较困难。…

npm ERR! PhantomJS not found on PATH

安装phantomj时发生报错 old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. npm ERR! code 1 npm ERR! path /va…

2024年【四川省安全员B证】新版试题及四川省安全员B证试题及解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【四川省安全员B证】新版试题及四川省安全员B证试题及解析&#xff0c;包含四川省安全员B证新版试题答案和解析及四川省安全员B证试题及解析练习。安全生产模拟考试一点通结合国家四川省安全员B证考试最新大纲及…