SVG:可缩放矢量图形(英语:Scalable Vector Graphics,SVG)是一种基于可扩展标记语言(XML),用于描述二维矢量图形的图形格式。 SVG由W3C制定,是一个开放标准。

  1. (function () {
  2. // svg 实现 watermark
  3. function __svgWM({
  4. container = document.body,
  5. content = '请勿外传',
  6. width = '300px',
  7. height = '200px',
  8. opacity = '0.2',
  9. fontSize = '20px',
  10. zIndex = 1000
  11. } = {}) {
  12. const args = arguments[0];
  13. const svgStr = `<svg xmlns="http://www.w3.org/2000/svg" width="${width}" height="${width}">
  14. <text x="50%" y="50%" dy="12px"
  15. text-anchor="middle"
  16. stroke="#000000"
  17. stroke-width="1"
  18. stroke-opacity="${opacity}"
  19. fill="none"
  20. transform="rotate(-45, 120 120)"
  21. style="font-size: ${fontSize};">
  22. ${content}
  23. </text>
  24. </svg>`;
  25. const base64Url = `data:image/svg+xml;base64,${window.btoa(unescape(encodeURIComponent(svgStr)))}`;
  26. const __wm = document.querySelector('.__wm');
  27.  
  28. const watermarkDiv = __wm || document.createElement("div");
  29. const styleStr = `
  30. position:absolute;
  31. top:0;
  32. left:0;
  33. width:100%;
  34. height:100%;
  35. z-index:${zIndex};
  36. pointer-events:none;
  37. background-repeat:repeat;
  38. background-image:url('${base64Url}')`;
  39.  
  40. watermarkDiv.setAttribute('style', styleStr);
  41. watermarkDiv.classList.add('__wm');
  42.  
  43. if (!__wm) {
  44. container.style.position = 'relative';
  45. container.insertBefore(watermarkDiv, container.firstChild);
  46. }
  47.  
  48. const MutationObserver = window.MutationObserver || window.WebKitMutationObserver;
  49. if (MutationObserver) {
  50. let mo = new MutationObserver(function () {
  51. const __wm = document.querySelector('.__wm');
  52. // 只在__wm元素变动才重新调用 __canvasWM
  53. if ((__wm && __wm.getAttribute('style') !== styleStr) || !__wm) {
  54. // 避免一直触发
  55. mo.disconnect();
  56. mo = null;
  57. __svgWM(JSON.parse(JSON.stringify(args)));
  58. }
  59. });
  60.  
  61. mo.observe(container, {
  62. attributes: true,
  63. subtree: true,
  64. childList: true
  65. })
  66. }
  67.  
  68. }
  69.  
  70. if (typeof module != 'undefined' && module.exports) { //CMD
  71. module.exports = __svgWM;
  72. } else if (typeof define == 'function' && define.amd) { // AMD
  73. define(function () {
  74. return __svgWM;
  75. });
  76. } else {
  77. window.__svgWM = __svgWM;
  78. }
  79. })();

参考: http://web.jobbole.com/94960/

前端生成水印之SVG方式的更多相关文章

  1. 网页加水印 svg 方式

    /** *网页加水印 svg 方式 * * @export * @param {*} [{ * container = document.body, * content = '请勿外传', * wid ...

  2. .NET中生成水印更好的方法

    .NET中生成水印更好的方法 为了保护知识产权,防止资源被盗用,水印在博客.网店等场景中非常常见. 本文首先演示了基于System.Drawing.Image做正常操作.然后基于Direct2D/WI ...

  3. Vue——前端生成二维码

    与后端生成二维码相比,前端生成二维码更具有灵活性,下面就介绍两种前端生成二维码的方式,两种方式相比之下,vue-qr比qrcode多了一个再中间添加logo的功能. 方式一:qrcode npm np ...

  4. 前端生成分享海报兼容H5和小程序

    ### 移动端分享海报生成 最近做项目需求是生成商品分享海报,并且保存到手机中要兼容H5和小程序<br> 与后端同学沟通后,海报在前端生成最省性能和有较好的交互体验,先看做好的效果

  5. 前端生成PDF,让后端刮目相看

    PDF 简介 PDF 全称Portable Document Format (PDF)(便携文档格式),该格式的显示与操作系统.分辨率.设备等因素没有关系,不论是在Windows,Unix还是在苹果公 ...

  6. WebGIS中等值线前端生成绘制简析

    文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景 等值线是GIS制图中常见的功能,一般有两种思路:一种是先进行插 ...

  7. 前端生成二维码 - Javascript生成二维码(QR)

    前段时间项目中需要动态的生成二维码,经过评估,前后端生成都可以.但后端生成会有两个问题: 没有找到正规发布出来的后端开源库. 二维码图片,会随着商品的增加而不断变多. 基于以上两个问题,决定在前端生成 ...

  8. H5纯前端生成Excel表格

    H5纯前端生成Excel表格方法如下: <!DOCTYPE html> <html> <head> <title></title> < ...

  9. Flink assignAscendingTimestamps 生成水印的三个重载方法

    先简单介绍一下Timestamp 和Watermark 的概念: 1. Timestamp和Watermark都是基于事件的时间字段生成的 2. Timestamp和Watermark是两个不同的东西 ...

随机推荐

  1. c++连续读取未知个数的数字

    #include <iostream> using namespace std; int main() { int n; ]; ,count=; while(cin>>n){ ...

  2. STSdb数据库的实现使用类

    STSdb 3.5是一个开源的key-value存储形式的数据库,它是用微软.net框架C#语言编写的.STSdb 3.5尤其使用于紧急任务或实时系统,如:股市交易,电子通信,实验室数据等,它的主要功 ...

  3. WebAPI调用笔记

    前言 即时通信项目中初次调用OA接口遇到了一些问题,因为本人从业后几乎一直做CS端项目,一个简单的WebAPI调用居然浪费了不少时间,特此记录. 接口描述 首先说明一下,基于Http协议的Get.Po ...

  4. day2作业

    购物车(两个程序)用户入口1商品信息存在文件里2已购商品,余额记录商家入口2可以添加商品,修改商品价格

  5. 老男孩Python九期全栈学习笔记4

    ---恢复内容开始--- day4 1.作业回顾 1.有变量name = 'aleX leNb',完成如下操作: 1)移除 name 变量对应的值两边的空格,并输出处理结果 2)移除 name 变量左 ...

  6. 20175212童皓桢 Java实验二-面向对象程序设计实验报告

    20175212童皓桢 Java实验二-面向对象程序设计实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设 ...

  7. Oracle中 “ORA-14551: 无法在查询中执行 DML 操作” 如何解决

    在编写一个数据库函数时,方法实现需要查询后进行修改,出现ora-14551的错误 create or replace function fun_DxcBillSn(tabType integer,ta ...

  8. Ubuntu 18.04 下 Redis 环境搭建

    一.安装 Redis ① 下载 wget http://download.redis.io/releases/redis-3.2.8.tar.gz ② 解压 tar -zxvf redis-3.2.8 ...

  9. elixir东游记:实现一个简单的中文语句解析

    备份:https://zhuanlan.zhihu.com/p/46030123 代码地址:github:pyzh/gdpl-ex.poc-1 原语句是:List1为'12332234':记a为Lis ...

  10. asp解码.net传参

    get传参时 asp默认使用gbk解码?了解的朋友指点下,谢谢 .net向asp传参时注意urlencode加密编码使用gb2312 附:任何语言的数据交互都要确保接收双方的编码一致