当前位置: 首页 > news >正文

VUE页面添加水印

let watermark = {};
let setWatermark = (text, sourceBody) => {
    let id = 'watermark_fjq_' + parseInt(Math.random() * 100000);
    if (document.getElementById(id) !== null) {
        document.body.removeChild(document.getElementById(id));
    }
    //水印图片
    let can = document.createElement('canvas');
    can.width = 373;// 单个水印大小
    can.height = 320;// 单个水印大小
    let cans = can.getContext('2d');
    cans.rotate(-20 * Math.PI / 180);
    cans.font = '14px Vedana';
    cans.fillStyle = '#DCDCDC';//水印颜色
    cans.textAlign = 'left';
    cans.textBaseline = 'Middle';
    cans.fillText(text, can.width / 20, can.height);//水印在画布的位置
    //设置插入div样式
    let water_div = document.createElement('div');
    water_div.id = id;
    water_div.style.pointerEvents = 'none';//水印层事件穿透 让水印不阻止交互事件
    water_div.style.overflow = 'hidden';
    water_div.style.background = 'url(' + can.toDataURL('image/png') + ') left top repeat';
    if (sourceBody) {
        sourceBody.style.position = 'relative';
        water_div.style.width = '100%';
        water_div.style.height = '100%';
        water_div.style.position = 'absolute';
        water_div.style.top = '0';
        water_div.style.left = '0';
        sourceBody.appendChild(water_div);
    } else {
        water_div.style.top = '3px';
        water_div.style.left = '0px';
        water_div.style.position = 'fixed';
        water_div.style.zIndex = '0';
        water_div.style.width = document.documentElement.clientWidth + 'px';
        water_div.style.height = document.documentElement.clientHeight + 'px';
        document.body.appendChild(water_div);
    }
    return id;
}

/**
 *  该方法只允许调用一次
 *  @param:
 *  @text == 水印内容
 *  @sourceBody == 水印添加在哪里,不传就是body
 * */
watermark.set = (text, sourceBody) => {
    setTimeout(() => {
        setWatermark(text, sourceBody);
    }, 1000);//延迟加载
}

export default watermark;

水印原理:前端水印的实现原理主要是利用canvas标签的一些属性,把水印图片作为div的背景图片

创建canvas元素
给canvas绘制文本,填充样式旋转角度、文字字体颜色等
将绘制好的canvas元素转换成base64格式的图片
动态创建一个div标签,相对位置属性为fixed,宽高设置为屏幕的可见大小,将上一步canvas转换的图片设置为div的背景图片并平铺满整个内部
最后将动态创建的div添加到body中sourceBody是添加的位置

注意点

好不容易在画布中绘制出酷炫的图形,应该把它保存起来吧。但不幸的是,画布中的这些图形本身不是真正的图片,不能直接保存。不幸中的万幸,Canvas API提供了toDataURL()方法,可以把画布中的图形转换为图片,

默认情况下,toDataURL()方法把图形转变成base64编码格式的png,然后返回Data URL数据。可以给toDataURL()传入MIME类型的参数,将画布转变成其它格式的图片。

有了Data URL数据后,就可将这些数据直接填充到<img>元素里,或者直接从浏览器里下载它们。这里通过一个实例,来说明如何使用toDataURL()方法,把整个画布保存为图片

局部页面使用:把warterMarkVUE.js文件引用到单页面内即可使用

全局使用:在App.vue中引用,

import watermark from "./warterMarkVUE";
mounted() {
    this.staffName =
      JSON.parse(sessionStorage.getItem("userInfo")) &&
      JSON.parse(sessionStorage.getItem("userInfo")).staffName
        ? JSON.parse(sessionStorage.getItem("userInfo")).staffName
        : "";
    this.staffCode =
      JSON.parse(sessionStorage.getItem("userInfo")) &&
      JSON.parse(sessionStorage.getItem("userInfo")).staffCode
        ? JSON.parse(sessionStorage.getItem("userInfo")).staffCode
        : "";
    var timer = this.dateFormat(new Date(), "yyyy-MM-dd hh:mm:ss");
    if (
      JSON.parse(sessionStorage.getItem("userInfo")) &&
      JSON.parse(sessionStorage.getItem("userInfo")).staffName
    ) {
      watermark.set(this.staffCode + " " + this.staffName + " " + timer); //设置水印名称
    }
  },

前端添加水印效果攻略【vue和原生js添加方式】_水香木鱼的博客-CSDN博客_前端页面使用js水印功能
vue实现为页面加水印 - 范斯 - 博客园
前端添加水印效果攻略【vue和原生js添加方式】_水香木鱼的博客-CSDN博客_前端页面使用js水印功能
前端页面添加水印_泡泡大怪兽的博客-CSDN博客_网页增加水印
vue实现给页面添加水印_前端搬砖王妹妹的博客-CSDN博客_vue页面添加水印
vue全局加水印(除登录页面)_陈噜啦的博客-CSDN博客_vue 加水印
 

相关文章:

  • 小米软开一面
  • 创建型模式-抽象工厂模式(三)
  • 美术作品登记版权如何收费?
  • 计算机毕业论文基于Python实现的仓库库存管理系统进销存储系统
  • 人工神经网络 人工智能,人工智能神经网络技术
  • 基于springboot的手办定制销售系统毕业设计源码031800
  • 《每日一题》NO.46:何为WAT/CP/FT?
  • 在Linux下如何实现禁止运行该程序多次?
  • HAIYPRH-PEG-DSPE,DSPE-PEG-HAIYPRH,磷脂-聚乙二醇-靶向肽HAIYPRH试剂供应
  • 发布自己的npm包注意事项
  • Vue的使用2
  • app毕业设计作品安卓毕业设计成品基于Uniapp+SSM实现的智能课堂管理
  • 神经网络试题答案,神经网络考试例题
  • 【论文分享】LibAFL: A Framework to Build Modular and Reusable Fuzzers
  • ESMM论文精读
  • canvas 绘制双线技巧
  • CSS 提示工具(Tooltip)
  • echarts的各种常用效果展示
  • JavaScript实现分页效果
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • node.js
  • Spring-boot 启动时碰到的错误
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 初识 webpack
  • 搞机器学习要哪些技能
  • 欢迎参加第二届中国游戏开发者大会
  • 计算机常识 - 收藏集 - 掘金
  • 快速构建spring-cloud+sleuth+rabbit+ zipkin+es+kibana+grafana日志跟踪平台
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 聊聊flink的TableFactory
  • 前端之React实战:创建跨平台的项目架构
  • 算法系列——算法入门之递归分而治之思想的实现
  • 通过git安装npm私有模块
  • 如何用纯 CSS 创作一个货车 loader
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (DFS + 剪枝)【洛谷P1731】 [NOI1999] 生日蛋糕
  • (k8s中)docker netty OOM问题记录
  • (附源码)springboot 基于HTML5的个人网页的网站设计与实现 毕业设计 031623
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (九十四)函数和二维数组
  • (蓝桥杯每日一题)平方末尾及补充(常用的字符串函数功能)
  • (已解决)vue+element-ui实现个人中心,仿照原神
  • (轉貼) 2008 Altera 亞洲創新大賽 台灣學生成果傲視全球 [照片花絮] (SOC) (News)
  • .Net 6.0 处理跨域的方式
  • .net core 控制台应用程序读取配置文件app.config
  • .NET Framework 4.6.2改进了WPF和安全性
  • .NET MVC第三章、三种传值方式
  • .NET 设计一套高性能的弱事件机制
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .net下的富文本编辑器FCKeditor的配置方法
  • [].shift.call( arguments ) 和 [].slice.call( arguments )
  • [20170705]diff比较执行结果的内容.txt
  • [20190113]四校联考