使用canvas添加水印

当页面过长时,会出现canvas标签太多,导致页面卡顿的问题,因此,添加的canvas采用fixed定位,这样无论页面多长

水印个数确定不变

css样式追加

 .canvasOverlay{
    pointer-events: none;
     position: fixed;
     left: 0;
     z-index:999;
}



function watermark(mapboxCanvas,username, textDis) {
    let canvasOverlay = document.createElement("canvas");
    //canvasOverlay.style.position = "absolute";
    canvasOverlay.id = "overlay-canvas";
    canvasOverlay.className="canvasOverlay";
    var winWidth =  document.documentElement.clientWidth;
    var winHeight =  document.documentElement.clientHeight;

    canvasOverlay.width = parseInt(winWidth);
    canvasOverlay.height = parseInt(winHeight);
    mapboxCanvas.prepend(canvasOverlay);

    const ctx = canvasOverlay.getContext('2d');

    //文本颜色就是描边的颜色
    ctx.strokeStyle = "black";
    //设置字体大小和字体类型
    ctx.font = "15px 微软雅黑";
    //取消虚线绘制
   //ctx.rotate((Math.PI / 180) * 8);
    ctx.globalAlpha = 0.2;
    //绘制文本
    for(let i=0;i<canvasOverlay.width;i+=textDis){
        for(let j=0;j<canvasOverlay.height;j+=textDis){
            ctx.strokeText(username,i,j);

        }
    }
};

此前使用的方法是追加n个p标签,存在两个问题;

在进行页面缩放的时候,删除之前的标签完成事件之前就开始追加新的;会导致字体重影;

第二个问题是使用浏览器的搜索功能会搜索出水印

因此该用canvas来做;其实canvas做更加简单,且效率更加高。

其中mapboxCanvas 为需要添加水印的div元素,username为水印的文字;textdis为水印文字之间的间隔。

function watermark(mapboxCanvas,username, textDis) {
    let canvasOverlay = document.createElement("canvas");
    canvasOverlay.style.position = "absolute";
    canvasOverlay.id = "overlay-canvas";
       canvasOverlay.width = parseInt(mapboxCanvas.clientWidth);
    canvasOverlay.height = parseInt(mapboxCanvas.clientHeight);
    mapboxCanvas.prepend(canvasOverlay);
    canvasOverlay.className="canvasOverlay";

    const ctx = canvasOverlay.getContext('2d');

    //文本颜色就是描边的颜色
    ctx.strokeStyle = "black";
    //设置字体大小和字体类型
    ctx.font = "15px 微软雅黑";
    //文字旋转
   ctx.rotate((Math.PI / 180) * 8);
    ctx.globalAlpha = 0.6;
    //绘制文本
    for(let i=0;i<canvasOverlay.width;i+=textDis){
        for(let j=0;j<canvasOverlay.height;j+=textDis){
            ctx.strokeText(username,i,j);

        }
    }
}

 

效果如下;

后来发现一个问题是;当canvas在最上层时,无法点击下方的dom元素

查阅资料后发现只要设置canvas元素的style属性 pointer-events: none即可;

目前发现的问题是没办法动态设置,因此在全局css文件中预先添加该样式,为canvas添加响应的class类名即可。

 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值