vue自定义指令给指定元素添加水印

在utils创建一个waterMark.js文件


import Vue from 'vue'

Vue.directive('watermark', {
	update: (el, binding) => {
		function addWaterMarker(parentNode, userName) {// 水印文字,父元素,字体,文字颜色
			var can = document.createElement('canvas');
			console.log(binding);
			el.style.pointerEvents = "none"
			parentNode.appendChild(can);
			can.width = 100;
			can.height = 100;
			var cans = can.getContext('2d');
			cans.rotate(-20 * Math.PI / 180);
			cans.font = "16px Microsoft JhengHei";
			cans.fillStyle = '#999';
			cans.textAlign = 'left';
			cans.textBaseline = 'Middle';
			cans.fillText(userName, can.width / 3, can.height / 2);
			parentNode.style.backgroundImage = "url(" + can.toDataURL("image/png") + ")";

			console.log(can);
			//此方法是防止用户通过控制台修改样式去除水印效果
			/* MutationObserver 是一个可以监听DOM结构变化的接口。 */
			const observer = new MutationObserver(() => {

				const wmInstance = can.parentElement
				//如果标签在,只修改了属性,重新赋值属性
				if (wmInstance) {
					// 避免一直触发
					// observer.disconnect();
					// console.log('水印属性修改了');
					parentNode.style.backgroundImage = "url(" + can.toDataURL("image/png") + ")";
				}
			})
			observer.observe(document.body, {
				attributes: true,
				subtree: true,
				childList: true,
			});
		}
		addWaterMarker(el, binding.value)
	}
})


在main文件里面引入

import '@/utils/waterMark.js';  // 添加水印

在需要用到的组件直接使用  userName是要显示的水印内容  

<canvas v-watermark="userName" class="canvas"> </canvas>

css样式 不固定 按需调整

  .ul {
    width: 100%;
    display: flex;
    justify-content: flex-start;
    flex-wrap: wrap;
    position: relative;
    .canvas {
      position: absolute;
      top: 0;
      left: 0;
      z-index: 9;
      width: 100%;
      height: 100%;
    }
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值