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