目录
👊🏻实现思路
创建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;
}
- 放最上层就是要保证水印的效果
- 使用css3的pointerEvents = “none”透传特性
- 设置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();//创建一个最高层脱离文档流的divconst div = createTopDiv(id, can);//加入document中document.body.appendChild(div);return id;
};
这里面的waterId大家可以设置的复杂一点,防止重复
总结
好了,水印功能完工,是不是通俗易懂。有问题可以给我留言哦!
我把对应的代码也上传了,想看源码的可以去翻找一下!!!
如果觉得有收获,麻烦给个赞和关注。你的鼓励是我写作的动力,大家一起学习一起进步。