<script lang="ts" setup>
import { ref, onMounted } from 'vue';
const waterPrintContainer = ref<HTMLDivElement>()
 * vue实现水印
 * 核心:canvas必须操作dom
 * 步骤1:创建一个存放水印的元素
 * 步骤2:通过canvas创建图片,以背景图的形式实现水印
 * 步骤3:防修改 MutationObserver()类的使用
// 封装getWater方法,组件挂载后执行,封装为了复用,后续我们回用到它
const createWaterPrint = () => {
    // 获取canvas画布元素,
    // TS中强制类型推断方式1:
    const canvas = <HTMLCanvasElement>document.getElementById('canvas')
    // 方式2:as 推断,react中只支持as推断
    // const canvas = document.getElementById('canvas') as HTMLCanvasElement
    // 设置宽高,它不需要element.style.width只需要canvas.width
    canvas.width = 100;
    canvas.height = 100;
    // 隐藏画布本身
    canvas.style.display = 'none';
    // 获取画笔
    const ctx = canvas.getContext('2d') as CanvasRenderingContext2D;
    // 设置文字大小
    ctx.font = '100px'
    // 文字颜色
    ctx.fillStyle = 'rgba(0,0,0,.9)'
    // 文字旋转
    ctx.rotate(-0.4)
    // 设置显示文字内容
    ctx.fillText('这是水印', canvas.width / 2, canvas.height / 2)
    // 将canvas转换为图片,返回一个url,是base64组成的图片的源数据
    // 可以直接赋值给图片的url的src属性
    const img = canvas.toDataURL('image/png')
    // 定义样式
    const style = `background-image:url(${img})`
    // 给water元素设置样式:
    const waterContainer = document.getElementById('water') as HTMLDivElement
    // 给要添加水印的元素设置样式:
    // water.setAttribute('style', style)或者如下:
    waterContainer.style.backgroundImage = `url(${img})`
 * 但是这有个问题:
 * 内行人可以去控制台找到水印的背景图取消勾选就没有水印
 * 我们得想办法不让他们改,这里要使用MutationObserver类
// 设置一个回调函数,当用户操作了元素的属性我就重新绘制canvas并设置为背景图
const callback = () => getWater()
onMounted(() => {
    // 获取water元素
    waterPrintContainer.value = <HTMLDivElement>document.getElementById('water')
    // 挂载完毕后我就绘制并设为背景图
    getWater()
    // 创建观察者,需要传入发生变化后执行的函数
    const observer = new MutationObserver(callback)
    // 获取观察的节点
    const targetNode = waterPrintContainer.value
    console.log(waterPrintContainer.value);//元素
    // 观察的属性,attributes属性,childList子节点有没有添加删除,后代节点
    const config = { attributes: true, childList: false, subtree: false }
    // 观察者实例观察目标元素和观察的方面,只要观发生变化就执行callback
    observer.observe(targetNode, config)
    // 这样水印就无法去除了
</script>
         *  MutationObserver是一个类
         * 基本使用方法:1选择需要观察变动的节点(dom元素)
         * const targetNode = document.getElementById('box')
         *  2.观察器配置(需要观察什么活动)
         * const config = {attributes:true,childList:true,subtree:true};
         *  3.当观察到变动时执行的操作回调函数
         *  const callback = () => console.log('触发回调')
         *  4.创建一个观察器实例并传入回调函数
         *  const observer = new MutationObserver(callback)
         *  5.开始观察目标节点
         *  observer.observe(targetNode,config)
         *  6.必要时停止观察
         *  observer.disconnect()
         * 观察器的配置参数含义:
         *  childList:true 表示观察目标子节点的变化,是否有添加或者删除
         *  attributes:true,表示观察属性变动
         *  subtree:true观察后代节点默认为false
复制代码
分类:
前端
  •