大牛的博客链接:https://www.cnblogs.com/daixinyu/p/6715398.html 提供给大家学习

我优化了几点

1,我把水印的样式单独提出来,这样会提高渲染水印的性能

2,他是给整个页面添加水印,我修改一下是给需要添加水印的容器来加水印

  1. function watermark(settings) {
  2. //默认设置
  3. var defaultSettings={
  4. watermark_txt:"text",
  5. watermark_x:20,//水印起始位置x轴坐标
  6. watermark_y:20,//水印起始位置Y轴坐标
  7. watermark_rows:20,//水印行数
  8. watermark_cols:20,//水印列数
  9. watermark_x_space:100,//水印x轴间隔
  10. watermark_y_space:50,//水印y轴间隔
  11. watermark_width:210,//水印宽度
  12. watermark_height:80,//水印长度
  13. };
  14. //采用配置项替换默认值,作用类似jquery.extend
  15. if(arguments.length===1&&typeof arguments[0] ==="object" ){
  16. var src=arguments[0]||{};
  17. for(key in src){
  18. if(src[key]&&defaultSettings[key]&&src[key]===defaultSettings[key])
  19. continue;
  20. else if(src[key])
  21. defaultSettings[key]=src[key];
  22. }
  23. }
  24. // 获取需要添加水印的容器
  25. var box = document.getElementById("box");
  26. // 创建水印容器 mark-box
  27. var markBox= document.createElement('div');
  28. markBox.className="mark-box";
  29.  
  30. //获取容器宽度
  31. var page_width = box.offsetWidth;
  32. //获取页面最大高度
  33. var page_height = box.offsetHeight;
  34. //如果将水印列数设置为0,或水印列数设置过大,超过页面最大宽度,则重新计算水印列数和水印x轴间隔
  35. if (defaultSettings.watermark_cols == 0 || (parseInt(defaultSettings.watermark_x + defaultSettings.watermark_width *defaultSettings.watermark_cols + defaultSettings.watermark_x_space * (defaultSettings.watermark_cols - 1)) > page_width)) {
  36. defaultSettings.watermark_cols = parseInt((page_width-defaultSettings.watermark_x+defaultSettings.watermark_x_space) / (defaultSettings.watermark_width + defaultSettings.watermark_x_space));
  37. defaultSettings.watermark_x_space = parseInt((page_width - defaultSettings.watermark_x - defaultSettings.watermark_width * defaultSettings.watermark_cols) / (defaultSettings.watermark_cols - 1));
  38. }
  39. //如果将水印行数设置为0,或水印行数设置过大,超过页面最大长度,则重新计算水印行数和水印y轴间隔
  40. if (defaultSettings.watermark_rows == 0 || (parseInt(defaultSettings.watermark_y + defaultSettings.watermark_height * defaultSettings.watermark_rows + defaultSettings.watermark_y_space * (defaultSettings.watermark_rows - 1)) > page_height)) {
  41. defaultSettings.watermark_rows = parseInt((defaultSettings.watermark_y_space + page_height - defaultSettings.watermark_y) / (defaultSettings.watermark_height + defaultSettings.watermark_y_space));
  42. defaultSettings.watermark_y_space = parseInt(((page_height - defaultSettings.watermark_y) - defaultSettings.watermark_height * defaultSettings.watermark_rows) / (defaultSettings.watermark_rows - 1));
  43. }
  44. var x;
  45. var y;
  46. for (var i = 0; i < defaultSettings.watermark_rows; i++) {
  47. y = defaultSettings.watermark_y + (defaultSettings.watermark_y_space + defaultSettings.watermark_height) * i;
  48. for (var j = 0; j < defaultSettings.watermark_cols; j++) {
  49. x = defaultSettings.watermark_x + (defaultSettings.watermark_width + defaultSettings.watermark_x_space) * j;
  50.  
  51. var mask_div = document.createElement('div');
  52. mask_div.id = 'mask_div' + i + j;
  53. mask_div.className = 'mask_div';
  54. mask_div.appendChild(document.createTextNode(defaultSettings.watermark_txt));
  55. //给水印定位
  56. mask_div.style.left = x + 'px';
  57. mask_div.style.top = y + 'px';
  58.  
  59. markBox.appendChild(mask_div);
  60. };
  61. };
  62. box.appendChild(markBox);
  63. }

  下面是水印样式

  1. .mask_div {
  2. position: absolute;
  3. overflow: hidden;
  4. z-index: 9999;
  5. opacity: 0.2;
  6. pointer-events: none;
  7. filter: alpha(opacity=20);
  8. font-size: 18px;
  9. font-family: 微软雅黑;
  10. color: rgb(170, 170, 170);
  11. text-align: center;
  12. width: 210px;
  13. height: 80px;
  14. display: block;
  15. -webkit-transform: rotate(-15deg);
  16. -moz-transform: rotate(-15deg);
  17. -ms-transform: rotate(-15deg);
  18. -o-transform: rotate(-15deg);
  19. transform: rotate(-15deg);
  20. }

调用方法watermark({options})

由于开发需求需要在附件查看页面添加水印,于是网上看到一位大牛写了一个js加水印的方法觉得很实用,也很方便,记录一下,哈哈的更多相关文章

  1. 多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量

    多动手试试,其实List类型的变量在页面上取到的值可以直接赋值给一个js的Array数组变量,并且数组变量可以直接取到每一个元素var array1 = '<%=yearList =>'; ...

  2. 小程序页面的四种文件(JSON、WXML、WXSS、JS)加载顺序

    一个小程序页面由四种文件组成: 1)json 页面配置文件 2)js 页面逻辑文件(必需) 3)wxml 页面结构文件(必需) 4)wxss 页面样式文件 这四个文件的加载顺序: 第一步: 加载页面j ...

  3. JS模块化开发:使用SeaJs高效构建页面

    一.扯淡部分 很久很久以前,也就是刚开始接触前端的那会儿,脑袋里压根没有什么架构.重构.性能这些概念,天真地以为前端===好看的页面,甚至把js都划分到除了用来写一些美美的特效别无它用的阴暗角落里,就 ...

  4. 用vuex写了一个购物车H5页面的示例代码

    用vuex写了一个购物车H5页面的示例代码:https://www.jb51.net/article/152008.htm 通过购物车的一个案列,把vuex学习了一篇. vuex概念浅谈 Vuex 是 ...

  5. 基于EasyNVR+EasyDSS H5视频直播二次开发实现业务需求:直接使用播放页面

    之前的"网页直播.微信直播技术解决方案:EasyNVR与EasyDSS流媒体服务器组合之区分不同场景下的easynvr"有介绍一些功能.由于客户需求,我们定制一下功能.给该套方案添 ...

  6. SNF开发平台WinForm之一-开发-单表表格编辑管理页面-SNF快速开发平台3.3-Spring.Net.Framework

    1.1运行效果: 1.2开发实现: 1.2.1          首先在数据库中创建需要开发的数据表,在代码生成器中进行配置连接数据库. 代码生成器的Config.xml文件配置如下节点: 1.2.2 ...

  7. Windows Phone 8初学者开发—第18部分:在页面间导航

    原文 Windows Phone 8初学者开发—第18部分:在页面间导航 原文地址:  http://channel9.msdn.com/Series/Windows-Phone-8-Developm ...

  8. SNF快速开发平台3.0之BS页面展示和九大优点-部分页面显示效果-Asp.net+MVC4.0+WebAPI+EasyUI+Knockout

    一)经过多年的实践不断优化.精心维护.运行稳定.功能完善: 能经得起不同实施策略下客户的折腾,能满足各种情况下客户的复杂需求. 二)编码实现简单易懂.符合设计模式等理念: 上手快,见效快.方便维护,能 ...

  9. 微信小程序tips集合:无法输入文字/随时查看页面/元素审查/点击事件/数据绑定

    1:编辑文档无法输入文字 出现这种情况一般是因为之前编辑的文档未保存,所有在其他文档输入的时候会自动输入到未保存的文档中,在文档暂时编辑完毕后要ctrl+s随手保存,不然会出现无法打字情况 2: 随时 ...

随机推荐

  1. intellij idea Entity类报错“Cannot resolve table”

    https://blog.csdn.net/u014290233/article/details/54311954 转载,以便下次查看

  2. Shiro官方快速入门10min例子源码解析框架3-Authentication(身份认证)

    在作完预备的初始化和session测试后,到了作为一个权鉴别框架的核心功能部分,确认你是谁--身份认证(Authentication). 通过提交给shiro身份信息来验证是否与储存的安全信息数据是否 ...

  3. 设置centos7.3的YUM源为国内阿里云源

     CentOS系统更换软件安装源 第一步:备份你的原镜像文件,以免出错后可以恢复. mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/Cent ...

  4. BZOJ4162:shlw loves matrix II

    传送门 利用Cayley-Hamilton定理,用插值法求出特征多项式 \(P(x)\) 然后 \(M^n\equiv M^n(mod~P(x))(mod~P(x))\) 然后就多项式快速幂+取模 最 ...

  5. 神奇的AC

  6. 关于java赋值运算的一个小例子

    直接贴代码,这个也是做题目中遇见的,觉得很好奇,查了一波,然后自己编写代码看了一下,果真如此,哈哈哈...... public class 关于Boolean的赋值运算 { public static ...

  7. C++学习笔记(2)----模板

    1. 与其他任何类相同,我们既可以在类模板内部,也可以在类模板外部为其定义成员函数,且定义在类模板内的成员函数被隐式声明为内联函数. 2. 默认情况下,对于一个实例化了的类模板,其成员只有在使用时才被 ...

  8. 如何激活 Trend Micro Deep Security Agent

    Deep Security 即服务包括反恶意软件保护.防火墙.入侵防御系统和完整性监视.Trend Micro Deep Security Agent (DSA) 可以配合 Deep Security ...

  9. C# Array类的Sort()方法

    Array类实现了数组中元素的冒泡排序.Sort()方法要求数组中的元素实现IComparable接口.如System.Int32 和System.String实现了IComparable接口,所以下 ...

  10. MHA源码分析——环境部署

    为了更好地了解MHA的原理,计划对MHA源码进行详细的阅读,本文主要为部署源码阅读环境. 一.概述 mha是由perl语言开发,这里想通过eclipse+perl组件来阅读其源码,所以我们环境需要安装 ...