资讯专栏INFORMATION COLUMN

如何用vue封装一个防用户删除的平铺页面的水印组件

yagami / 2080人阅读

摘要:需求为了防止截图等安全问题,在项目页面中生成一个平铺全屏的水印要求水印内容为用户名,水印节点用户不能通过开发者工具等删除效果如上图在节点下插入水印节点,水印节点覆盖在页面最上层但不影响页面正常操作在通过或者用户通过开发者工具删除或修改水印节

需求

为了防止截图等安全问题,在web项目页面中生成一个平铺全屏的水印

要求水印内容为用户名,水印节点用户不能通过开发者工具等删除

效果

如上图

body节点下插入水印DOM节点,水印节点覆盖在页面最上层但不影响页面正常操作

在通过js或者用户通过开发者工具删除或修改水印节点时自动复原

原理

通过canvas画出节点需生成水印的文字生成base64图片

生成该水印背景图的div节点插入到body下,通过jsMutationObserver方法监听节点变化,再自动重新生成

生成水印DOM节点

// 生成水印DOM节点    
init () {
      let canvas = document.createElement("canvas")
      canvas.id = "canvas"
      canvas.width = "200" // 单个水印的宽高
      canvas.height = "130"
      this.maskDiv = document.createElement("div")
      let ctx = canvas.getContext("2d")
      ctx.font = "normal 18px Microsoft Yahei" // 设置样式
      ctx.fillStyle = "rgba(112, 113, 114, 0.1)" // 水印字体颜色
      ctx.rotate(30 * Math.PI / 180) // 水印偏转角度
      ctx.fillText(this.inputText, 30, 20)
      let src = canvas.toDataURL("image/png")
      this.maskDiv.style.position = "fixed"
      this.maskDiv.style.zIndex = "9999"
      this.maskDiv.id = "_waterMark"
      this.maskDiv.style.top = "30px"
      this.maskDiv.style.left = "0"
      this.maskDiv.style.height = "100%"
      this.maskDiv.style.width = "100%"
      this.maskDiv.style.pointerEvents = "none"
      this.maskDiv.style.backgroundImage = "URL(" + src + ")"
      // 水印节点插到body下
      document.body.appendChild(this.maskDiv)
    },

监听DOM更改

// 监听更改,更改后执行callback回调函数,会得到一个相关信息的参数对象
    Monitor () {
      let body = document.getElementsByTagName("body")[0]
      let options = {
        childList: true,
        attributes: true,
        characterData: true,
        subtree: true,
        attributeOldValue: true,
        characterDataOldValue: true
      }
      let observer = new MutationObserver(this.callback)
      observer.observe(body, options) // 监听body节点
    },
使用

直接引入项目任何组件中使用即可

组件prop接收三个参数

  props: {
    // 显示的水印文本
    inputText: {
      type: String,
      default: "waterMark水印"
    },
    // 是否允许通过js或开发者工具等途径修改水印DOM节点(水印的id,attribute属性,节点的删除)
    // true为允许,默认不允许
    inputAllowDele: {
      type: Boolean,
      default: false
    },
    // 是否在组件销毁时去除水印节点(前提是允许用户修改DOM,否则去除后会再次自动生成)
    // true会,默认不会
    inputDestroy: {
      type: Boolean,
      default: false
    }
  }

inputText(String):需要生成的水印文本,默认为"waterMark水印"

inputAllowDele(Boolean):是否需要允许用户删除水印DOM节点,true为允许,默认不允许

inputDestroy(Boolean):是否在组件销毁时去除水印节点,true会,默认不会,(只有在inputAllowDele为ftrue时才能生效)

如果需要修改水印大小,文字,颜色等样式,可直接进入组件中按注释修改

小结

工作写了个相关组件,复用率挺高就封装了下,没有经过严格测试,可当做参考使用,有需要的朋友欢迎下载源码使用相关GitHub代码

当然在浏览器端无论怎样也不能完全防止用户的的行为,但也能满足多数需求场景

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/99821.html

相关文章

  • 何用vue打造一个移动端音乐播放器

    摘要:写在前面没错,这就是慕课网上的那个音乐播放器,后台是某音乐播放器的线上接口扒取,虽然这类项目写的人很多,但不得不说这还是个少有的适合提升的好项目,做这个项目除了想写一个比较大并且功能复杂的项目,主要原因是要拿它来应对面试,也确实对我的业务能 写在前面 没错,这就是慕课网上的那个vue音乐播放器,后台是某音乐播放器的线上接口扒取,虽然这类项目写的人很多,但不得不说这还是个少有的适合vu...

    lanffy 评论0 收藏0
  • 手摸手教你用canvas实现给图片添加平铺水印

    摘要:最近项目中遇到一个需求,需要把一张图片加上平铺的水印类似这样的效果首先想到的是用完成这种功能,因为我之前也没有接触过,所以做这个功能的时候,就是一步一步的摸索中学习,过程还是挺的,接下来跟我一步步来实现这个功能以及发现一些的坑吧。 最近项目中遇到一个需求,需要把一张图片加上平铺的水印 类似这样的效果showImg(https://segmentfault.com/img/remote/...

    崔晓明 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<