web页面水印

web页面增长水印

实现路程css

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

(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)
      
})()
复制代码

👌图片生成出来了,页面上有水印了,这么简单的,任务是否是就完成了呢,否则否则canvas

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

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

看起来就是咱们想要的功能,用它试试浏览器

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

(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)
})()
复制代码

啊哈,这下删不掉了吧

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

三、 媒体样式 打印时去掉水印样式dom

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

完整代码ui

(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)
})()
复制代码
相关文章
相关标签/搜索