欲實現的水印平鋪的效果圖以下:css
從圖上看,應該作到如下幾點:canvas
文字在X和Y方向上進行平鋪;app
文字進行了必定的角度的旋轉;字體
水印做爲背景,其z-index位置應位於頁面內容底部, 即不能覆蓋頁面主內容;ui
平鋪的水印應能隨窗口大小改變進行自適應。this
思路:spa
首先咱們先在canvas上繪製以下圖所示一小塊畫布:prototype
var tpl = '<canvas id = "watermark" width = "160px" height = "100px" style="display:none;"></canvas>';
將單一水印繪製在canvas畫布裏,而後將canvas節點插入到須要平鋪水印的容器裏,例如這裏將canvas標籤插入到body裏面。code
$(document.body).append(tpl);
這裏簡要說明:canvas標籤width height屬性,若不進行指定,則會有個默認的大小(300px * 150px),而且,這塊畫布的大小使用外部css文件設定寬高是無效的。事件
下面開始在canvas裏面繪製單一水印:
var cw = $('#watermark')[0]; var ctx = cw.getContext("2d"); //返回一個用於在畫布上繪圖的環境 ctx.cearRect(0,0,160,100); //繪製以前畫布清除 ctx.font="20px 黑體"; ctx.rotate(-20*Math.PI/180); ctx.fillStyle = "rgba(100,100,100,0.1)"; ctx.fillText("465dd92381", -20, 80); ctx.rotate('20*Math.PI/180'); //座標系還原
實現了一小塊畫布的繪製之後,再建一個canvas畫布(id爲repeat-watermark):
var tplr = '<canvas id = "repeat-watermark"></canvas>'; $(document.body).append(tplr);
爲整塊畫布設定樣式:
#repeat-watermark{ position:fixed; z-index:-1; top:0; background: #fff; }
z-index的值能夠根據須要調整,使其位於頁面底部平鋪。
另做一點說明:位於水印上層的頁面若是想讓水印始終可見,能夠將頁面中使用的顏色使用rgba設置。
下面將前面繪製的id爲watermark的canvas 在當前的canvas(id爲repeat-watermark)裏採用createPattern方法進行平鋪:
var crw = $('#repeat-watermark')[0]; crw.width = $(document).width(); crw.height = $(document).height(); ctxr = crw.getContent("2d"); ctxr.clearRect(0,0,crw.width,crw.height); //清除整個畫布 var pat = ctxr.createPattern(cw, "repeat"); //在指定的方向上重複指定的元素 ctxr.fillStyle = pat; ctxr.fillRect(0, 0, crw.width, crw.height);
此時還有一個問題,因爲水印繪製只隨着頁面進行了一次加載,於是當窗口改變大小時,頁面背景水印不會跟隨改變進行填充或者裁剪,而是會出現空白,所以,將上述繪製水印封裝爲draw方法,而後添加如下事件:
$(window).resize(function(){ var w = $(document).width(); var h = $(document).height(); self.draw(w, h); });
下面附上源碼:
'use strict'; require('./watermark.css'); var Watermark = function(container, options) { var self = this; self.opt = { docWidth: $(document).width(), docHeight: $(document).height(), fontStyle: "20px 黑體", //水印字體設置 rotateAngle: -20 * Math.PI / 180, //水印字體傾斜角度設置 fontColor: "rgba(100, 100, 100, 0.1)", //水印字體顏色設置 firstLinePositionX: -20, //canvas第一行文字起始X座標 firstLinePositionY: 80, //Y SecondLinePositionX: 0, //canvas第二行文字起始X座標 SecondLinePositionY: 70 //Y }; $.extend(self.opt, options); self.render(container); self.draw(self.opt.docWidth, self.opt.docHeight); self.events(); }; Watermark.prototype = { render: function(d) { var self = this; d.append(tpl); }, draw: function(docWidth, docHeight) { var self = this; var cw = $('#watermark')[0]; var crw = $('#repeat-watermark')[0]; crw.width = docWidth; crw.height = docHeight; var ctx = cw.getContext("2d"); //清除小畫布 ctx.clearRect(0, 0, 160, 100); ctx.font = self.opt.fontStyle; //文字傾斜角度 ctx.rotate(self.opt.rotateAngle); ctx.fillStyle = self.opt.fontColor; //第一行文字 ctx.fillText(self.opt.watermark, self.opt.firstLinePositionX, self.opt.firstLinePositionY); //第二行文字 //ctx.fillText(window.watermark.mobile, self.opt.SecondLinePositionX, self.opt.SecondLinePositionY); //座標系還原 ctx.rotate(-self.opt.rotateAngle); var ctxr = crw.getContext("2d"); //清除整個畫布 ctxr.clearRect(0, 0, crw.width, crw.height); //平鋪--重複小塊的canvas var pat = ctxr.createPattern(cw, "repeat"); ctxr.fillStyle = pat; ctxr.fillRect(0, 0, crw.width, crw.height); }, events: function() { var self = this; $(window).resize(function() { var w = $(document).width(); var h = $(document).height(); self.draw(w, h); }); } }; var tpl = '<canvas id = "watermark" width = "160px" height = "100px" style="display:none;"></canvas>' + '<canvas id = "repeat-watermark"></canvas>'; module.exports = Watermark;