最近工作需求,需要在页面上加水印,但发现网上示例无法满足我的需求,所以还是自己动手写。

有几个特别需求:

1.可以写多行水印,并且中心对齐。

2.每行水印错开。

PS:我找到的例子都是单行水印,所以用不了,想做的效果如下。

(图1)
实现思路

实现页面水印主要是有两种方法。

1.DOM元素

就是将水印放置DOM元素里,按一定规律铺设在目标区域。

优点:

(1).元素计算方式相对简单些

缺点:

(1).目标区域长宽可能会变化,水印元素需要动态设置。
(2).在一片区域中,可能会导致页面DOM元素过多。

2.canvas

先将水印写在canvas里,然后生成背景图,用背景图铺设。

优点:

(1).不用担心目标区域动态变化。

缺点:

(2).计算方式复杂。

思量后,选择了第二种实现方式,性能为重。

实现难点

1.canvas没有针对文字的旋转

在canvas绘图里面,没有针对文字旋转的控制,所以只能旋转画布后,对每行文字一个个按规律排放。

如下图,x0y是视区(也就是你能看到的),x’0y’是旋转了A角度后的画布,所以我们在画布绘制时,每行文字的位置都要做一个修正。

(图2)

PS:矩形代表每行文字,width是每行文字的水平间距,height是第一行文字y坐标。

得出每行文字坐标公式是(伪代码):

x = width * cosA;

y = x * tanA + height;

2.每行水印错开
如果我们只生成一行水印,那么当做背景图使用时候,那么在竖方向上,都是一样的,这样看起来有点僵硬,如下图。

(图3)

所以在错开的方法上,我使用了三个canvas,第一个canvas正式绘制,第二个将文字数组倒过来绘制,将前两个绘制在第三个canvas上,这样就错开了。

3.每行文字长度不等引起的水平间距问题

如下图,a、b是两段文字,较长的b会导致水平方向间距变大,如果直接使用做背景图,那么在背景repeat时候,将存在水平方向长短不一情况,看起来很难受。

(图4)

对于这个问题,我的解决方法是,将a、b两段文字水平方向上重复绘制多次,就变成绘制a、b、a、b、a、b,在足够多的次数后,看到间距就正常。

4.第一行文字x不是从0开始

其实在画布旋转后,在视窗里看到的第一行就不是从0开始(虽然绘制是0),从图2就可以看到,还有一段距离。

(图5)

例如将第一行移到视窗p点,那么就要做tx、ty的修正,伪代码:

tx = height * sinA * cosA;

ty = height * sinA * sinA;

PS:这个地方如果有人看我代码,就会发现ty乘多一个sinA,位移才正确,这一点我也想不懂,希望有人知道告诉我。

代码

我将代码放到GitHub上,有啥建议请提。

代码地址: https://github.com/codingforme/jquery-watermark

最后的效果,其实就是图1。

总结

这是个简单的插件,代码不多,其实本身也不需要jquery,只是习惯性这么实现。这里其实有个重点,就是视区和画布,我在svg文章里面有总结过,可以看看,另外我遇到的几个难点的解决办法,希望对大家有所发现。

本文为原创文章,转载请保留原出处,方便溯源,如有错误地方,谢谢指正。

本文地址 :http://www.cnblogs.com/lovesong/p/5014584.html

jquery页面水印插件,支持多行水印、行错开的更多相关文章

  1. 让jQuery的ajaxFileUpload插件支持onchange事件

    ajaxFileUpload插件只能上传一次的BUG发现还不少人遇到,很不幸我也遇到的,使用后发现里面的坑还不少,在createUploadForm方法中有句 var newElement = jQu ...

  2. jQuery页面引导插件 jquery-pagewalkthrough

    http://jwarby.github.io/jquery-pagewalkthrough/ 源码 https://github.com/jwarby/jquery-pagewalkthrough

  3. 强大的jQuery幻灯片播放插件 支持全拼、拖拽和下载等功能

    在线演示 本地下载

  4. jquery水印插件:placeholder

    jquery水印插件:placeholder 有的浏览器支持html5的水印placeholder(如Crome,firefox,ie10+),有的不支持html5的placeholder(ie9,i ...

  5. jQuery 人脸识别插件,支持图片和视频

    jQuery Face Detection 是一款人脸检测插件,能够检测到图片,视频和画布中的人脸坐标.它跟踪人脸并输出人脸模型的坐标位置为一个数组.我们相信,面部识别技术能够给我们的 Web 应用带 ...

  6. 使用jQuery的Scrollify插件实现鼠标滚轮或者手势滑动到页面下一节点部分

    有时我们需要做一个单页面介绍产品特性,而单页面内容非常多且页面非常长,为了快速定位到产品特性节点,我们使用js侦听用户滚轮事件,当用户触发滚轮滑动或者使用手势触屏滑动时,即可定位到相应的节点.一款jQ ...

  7. wordpress图片水印插件DX-Watermark

    DX-Watermark是一款功能齐全的wordpress图片水印插件,可以自动给上传的图片添加文本或者图片水印. 后台截图: 文本水印: 图片水印: 选项说明: 类型:可选择文本或图片水印两种类型, ...

  8. 表格(table) 插件:支持当前行增行、删除。使用事件委托

    最近做一个项目,需要对表格进行增行和删行. 研究了一下jquery操作dom的方法和事件委托原理,下面是我编写的例子,源码传上,欢迎高手指点. 功能: 支持在指定行下面增行: 支持删行指定行: 增行. ...

  9. PHP 上传图片,生成水印,支持文字, gif, png

    //admin_upfile.php <html> <meta http-equiv="Content-Type" content="text/html ...

随机推荐

  1. Docker改名为Moby了吗?

    背景 在DockerCon17上,Docker发布了两个新的开源项目LinuxKit和Moby.而原来在Github上托管的docker也随着PR #32691的合入正式变为Moby.这究竟是什么情况 ...

  2. IIC模块TestBench的书写方法

    今天在看黑金AX309FPGA开发板自带教程中的EEPROM那一章,考虑如何写其中iic_com模块的TestBench,难点在于1. 该模块存在一个inout型的端口信号:2. 时序较为复杂,不可能 ...

  3. 修改linux系统时间和同步

    date 查看当前时间 date -s 15:14:13 修改时间 cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 修改时区 yes cront ...

  4. Angularjs快速入门(四)-css类和样式

    例子: .error{background-color:red;} .warning{background-color:yellow;} <div ng-controller='HeaderCo ...

  5. 创建一个JS函数,运用JS中arguments对象

    Javascript中有个内置的arguments对象. arguments对象包含了参数调用的参数数组. <p>查找最大的数.</p> <p id="demo ...

  6. 单Js 的重力游戏开发

    最近在用看cocos的时候萌生的想法,单纯js实现重力原理.然后就做了一个这样的小游戏.姑且命名为<超级玛丽>! 因为之前有人要我做超级玛丽.哈哈哈哈哈哈!这也算完成任务了吧. 先说一下原 ...

  7. JQuery 通过方向键控制div上下左右移动

    在CSS中当DOM元素的position属性为absolute或relative时,我们可以通过改变这个元素的left和top属性的具体值来控制元素在页面中显现的位置. 利用上述属性,我们可以简单实现 ...

  8. C#基础知识-函数的定义和调用(五)

    函数也可以称为方法,可以很方便的把一些行为封装到函数里面,当调用这一函数时会把函数块里面的代码按照顺序执行,方法可以有多种形式,有无参数,有无返回值等. 1. 函数的定义   函数定义的基本格式: s ...

  9. C#基础知识-基本的流程控制语句(三)

    所谓的流程控制就是在程序运行中控制程序的走向,可以通过各种的条件判断执行代码的顺序,有if... if...else.. else...if |switch case...|while... Do.. ...

  10. oracle一直不确定的distinct多字段处理情况整理

    第一步,建一个表,表数据如下: 第二步:发现叫豆豆的是两只狗,一只是金毛犬,一只狼青. 如果我用 select 宠物名称,宠物大类 from test_1;返回结果就只有一条. 如果我用 select ...