web页面水印

web页面增加水印

实现路程

1、用canvas生图,把图片fixed在页面上

(function createCanvas(){
      var width =100;
      var height =100;
      var x =10;
      var y =10;
      var rotate=30;
      var fontSize =16;
      var alpha =0.7;//透明度
      var color='#999'
      var canvas = document.createElement('canvas');
      canvas.setAttribute('width', width);
      canvas.setAttribute('height', height);

       var ctx = canvas.getContext("2d");

       ctx.textAlign = 'top';//在绘制文本时使用的当前文本基线
       ctx.textBaseline = 'left';//设置或返回文本内容的当前对齐方式
       ctx.font = `${fontSize}px Arial`//ctx.font = '24px Arial';
       ctx.fillStyle = color;
       ctx.globalAlpha = alpha;//设置或返回绘图的当前 alpha 或透明值
       ctx.rotate(Math.PI / 180 * rotate);//将画布旋转30度
       ctx.fillText('水印', parseFloat(width) / 2, parseFloat(height) / 2);
       var base64Url = canvas.toDataURL();//生成图片转换成base64格式

       var watermarkDiv = document.createElement("div");
       var styleStr = `
         position:fixed;
         top:0;
         left:0;
         bottom:0;
         right:0;
         z-index:${9999};
         pointer-events:none;
         background-repeat:repeat;
         background-image:url('${base64Url}')`;

       watermarkDiv.setAttribute('style', styleStr);
       document.body.appendChild(watermarkDiv)
      
})()
复制代码

?图片生成出来了,页面上有水印了,这么简单的,任务是不是就完成了呢,不然不然

用户可以通过修改dom样式或者删除dom节点来屏蔽水印,这样一来,水印加的还有啥用呢。emmm,得需要一个dom元素监听事件,一旦发生此事,要告知我才行。

web api中有一个叫做MutationObserver的接口: MutationObserver接口提供了监视对DOM树所做更改的能力。 DOM 的任何变动,比如节点的增减、属性的变动、文本内容的变动,这个 API 都可以得到通知。

看起来就是我们想要的功能,用它试试

2、我们要做的就是,监听到dom元素被删除的话,我们就把自动新增dom元素;监听到修改了dom元素的样式,我们就自动重置样式

(function createCanvas(){
      var width =100;
      var height =100;
      var x =10;
      var y =10;
      var rotate=30;
      var fontSize =16;
      var alpha =0.7;//透明度
      var color='#'
      var canvas = document.createElement('canvas');
      canvas.setAttribute('width', width);
      canvas.setAttribute('height', height);

       var ctx = canvas.getContext("2d");

       ctx.textAlign = 'top';//在绘制文本时使用的当前文本基线
       ctx.textBaseline = 'left';//设置或返回文本内容的当前对齐方式
       ctx.font = `${fontSize}px Arial`//ctx.font = '24px Arial';
       ctx.fillStyle = color;
       ctx.globalAlpha = alpha;//设置或返回绘图的当前 alpha 或透明值
       ctx.rotate(Math.PI / 180 * rotate);//将画布旋转30度
       ctx.fillText('水印', parseFloat(width) / 2, parseFloat(height) / 2);//从cookie里获取userName
       var base64Url = canvas.toDataURL();

       var wm = document.getElementById('waterMark');

       var watermarkDiv = wm || document.createElement("div");
       var styleStr = `
         position:fixed;
         top:0;
         left:0;
         bottom:0;
         right:0;
         z-index:${9999};
         pointer-events:none;
         background-repeat:repeat;
         background-image:url('${base64Url}')`;

       watermarkDiv.setAttribute('style', styleStr);
       watermarkDiv.id ='waterMark'

      var  bodyContainer = document.body;
      
       if (!wm) {
         bodyContainer.appendChild(watermarkDiv)
       }
   
       const MutationObserver = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;//检测浏览器是否支持该特性
       if (MutationObserver) {
         var observer = new MutationObserver(function () {
           var wm = document.getElementById('waterMark');
           // 只在wm元素样式被修改或者元素被移除时
           if ((wm && wm.getAttribute('style') !== styleStr) || !wm) {
             // 避免一直触发
             observer.disconnect();//解除监听
             observer = null;
             createCanvas()
           }
         });

         observer.observe(bodyContainer, { //监听body元素子元素的变化
           attributes: true,
           subtree: true,
           childList: true
         })
       }

      var styleEl =  document.createElement('style');
      styleEl.setAttribute('type','text/css');
      document.head.appendChild(styleEl)
})()
复制代码

啊哈,这下删不掉了吧

还有一点就是如果要打印页面的话,你会发现,水印也打印在上边

3、 媒体样式 打印时去掉水印样式

//只需要新增一行 即可
  styleEl.innerText ='@media  print{ #waterMark{ display:none } }';
复制代码

完整代码

(function createCanvas(){
      var  bodyContainer = document.body;
      var width =100;
      var height =100;
      var x =10;
      var y =10;
      var rotate=30;
      var fontSize =16;
      var alpha =0.7;//透明度
      var color='#'
      var canvas = document.createElement('canvas');
      canvas.setAttribute('width', width);
      canvas.setAttribute('height', height);

       var ctx = canvas.getContext("2d");

       ctx.textAlign = 'top';//在绘制文本时使用的当前文本基线
       ctx.textBaseline = 'left';//设置或返回文本内容的当前对齐方式
       ctx.font = `${fontSize}px Arial`//ctx.font = '24px Arial';
       ctx.fillStyle = color;
       ctx.globalAlpha = alpha;//设置或返回绘图的当前 alpha 或透明值
       ctx.rotate(Math.PI / 180 * rotate);//将画布旋转30度
       ctx.fillText('水印', parseFloat(width) / 2, parseFloat(height) / 2);//从cookie里获取userName
       var base64Url = canvas.toDataURL();

       var wm = document.getElementById('waterMark');

       var watermarkDiv = wm || document.createElement("div");
       var styleStr = `
         position:fixed;
         top:0;
         left:0;
         bottom:0;
         right:0;
         z-index:${9999};
         pointer-events:none;
         background-repeat:repeat;
         background-image:url('${base64Url}')`;

       watermarkDiv.setAttribute('style', styleStr);
       watermarkDiv.id ='waterMark'

       if (!wm) {
         bodyContainer.appendChild(watermarkDiv)
       }
   
       const MutationObserver = window.MutationObserver || window.WebKitMutationObserver|| window.MozMutationObserver;//检测浏览器是否支持该特性
       if (MutationObserver) {
         var observer = new MutationObserver(function () {
           var wm = document.getElementById('waterMark');
           // 只在wm元素样式被修改或者元素被移除时
           if ((wm && wm.getAttribute('style') !== styleStr) || !wm) {
             // 避免一直触发
             observer.disconnect();
             observer = null;
             createCanvas()
           }
         });

         observer.observe(bodyContainer, { //监听body元素子元素的变化
           attributes: true,
           subtree: true,
           childList: true
         })
       }

      var styleEl =  document.createElement('style');
      styleEl.setAttribute('type','text/css');
      styleEl.innerText ='@media  print{ #waterMark{ display:none } }';
      document.head.appendChild(styleEl)
})()
复制代码

转载于:https://juejin.im/post/5cf8befa51882546934e636f

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值