首先说明:有三个文件:1个H5,一个js(代码较长),一个水印js插件(地址:https://code.jquery.com/jquery-git.js

所有代码已经上传到github:作者水印github位置

备注:经过测试,该效果在IE7.8.9版本下无法显示水印,其他浏览器版本都可以


网页效果图:

HTML代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta content="text/html; charset=utf-8" http-equiv="Content-Type"/>
</head>
<body>
<table  border="0" width="800" height="800" align="center" cellpadding="0" cellspacing="0" id="table1" bgcolor="#008b8b">
    <tr align="center">
        <td>测试页面  测试页面</td>
        <td>测试页面  测试页面</td>
    </tr>
</table>
</body>
<script src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script src="https://code.jquery.com/jquery-git.js"></script>
<script type="text/javascript" src="../js/shuiyin2.js" charset="utf-8"></script>
<script type="text/javascript">
    var nowDay = getnowDay();
    var nowTime = getnowTime();
    $('#table1').watermark({
        texts : ["A B C X Y Z +"+nowDay,nowTime], //水印文字
        textColor : "#DCDCDC", //文字颜色
        textFont : '14px 微软雅黑', //字体
        width : 130, //水印文字的水平间距
        height : 120,  //水印文字的高度间距(低于文字高度会被替代)
        textRotate : -20 //-90到0, 负数值,不包含-90
    })
</script>
<script>

</script>
</html>

 水印:shuiyin2.js代码:

(function(){

    var watermark = function(self){
        this.elem = self;
    }

    watermark.prototype = {
        defaults : {
            texts : ['此处水印文字'],
            width : 100, //每行水印文字的水平间距
            height : 100, //水印文字的高度间距(低于文字高度会被替代)
            textRotate : -30 , //文字旋转 度数
            textColor : '#ede8e8', //文字颜色
            textFont : '15px 微软雅黑' //字体
        },
        options : {
            canvas : []
        },
        init : function(options){
            $.extend(this.options, this.defaults, options);
            var $body = $('body'),
                can1 = this.__createCanvas($body),
                can2 = this.__createCanvas($body),
                canAll = this.__createCanvas($body),
                settings = this.options,
                txtlen = settings.texts.length;

            settings.deg = settings.textRotate * Math.PI / 180; //js里的正弦余弦用的是弧度

            this.__calcTextSize($body);
            var repeatTimes = Math.ceil(screen.width / settings.txts.length / settings.width);
            settings.canvasWidth = settings.canvasWidth * repeatTimes;
            var extTxts = [];
            while(repeatTimes--) extTxts = extTxts.concat(settings.txts);
            settings.txts = extTxts;

            var fixH = settings.maxWidth * Math.abs(Math.sin(settings.deg)) + Math.cos(settings.deg) * settings.textHeight;
            if(fixH > settings.height) settings.height = fixH;
            var ctx1 = this.__setCanvasStyle(can1, settings.canvasWidth, settings.height);
            var ctx2 = this.__setCanvasStyle(can2, settings.canvasWidth, settings.height);
            var ctx = this.__setCanvasStyle(canAll, settings.canvasWidth, settings.height * 2, true);

            this.__drawText(ctx1, settings.txts);
            this.__drawText(ctx2, settings.txts.reverse());

            //合并canvas
            ctx.drawImage(can1, 0, 0, settings.canvasWidth, settings.height);
            ctx.drawImage(can2, 0, settings.height, settings.canvasWidth, settings.height);
            var dataURL = canAll.toDataURL("image/png");
            $(this.elem).css('backgroundImage', "url("+ dataURL +")");
            //this.__destory();
        },
        __createCanvas : function($container){
            var canvas = document.createElement('canvas');
            $container.append(canvas);
            this.options.canvas.push(canvas);
            return canvas;
        },
        __calcTextSize : function($container){
            var txts = [],
                maxWidth = 0,
                canvasWidth = 0,
                settings = this.options;
            $.each(settings.texts, function(i, text){
                var span = $('<span style="font:'+settings.textFont+';visibility: hidden;display: inline-block;"> '+text+ '</span>')
                    .appendTo($container);
                var tWidth = span[0].offsetWidth,
                    tHeight = span[0].offsetHeight;
                span.remove();
                txts.push({
                    txt : text,
                    width : tWidth,
                    height : tHeight
                });
                maxWidth = Math.max(maxWidth, tWidth);
                settings.textHeight = tHeight;
                var shadow = Math.cos(settings.deg) * tWidth;
                canvasWidth += (settings.width < shadow ? shadow : settings.width) - tHeight * Math.sin(settings.deg);
            });
            settings.txts = txts;
            settings.maxWidth = maxWidth;
            settings.canvasWidth = canvasWidth;
        },
        __setCanvasStyle : function(canvas, width, height, notextstyle){
            canvas.width = width;
            canvas.height = height;
            canvas.style.display='none';

            var ctx = canvas.getContext('2d');
            if(!notextstyle){
                var deg = this.options.deg,
                    absSindeg = Math.abs(Math.sin(deg));
                ctx.rotate(deg);
                //基于视窗的 x、y偏移量
                var offset = absSindeg * this.options.height - this.options.textHeight * absSindeg;
                var nx = - offset * Math.cos(deg),
                    ny = - offset * absSindeg;
                ctx.translate( nx, ny * absSindeg);

                ctx.font = this.options.textFont;
                ctx.fillStyle = this.options.textColor;
                ctx.textAlign = 'left';
                ctx.textBaseline = 'Middle';
            }
            return ctx;
        },
        __drawText: function(ctx, txts){
            var settings = this.options;
            $.each(txts, function(i, obj){

                var wnap = (settings.maxWidth - obj.width) / 2 ;
                var x = settings.width * Math.cos(settings.deg) * i,
                    y = - x * Math.tan(settings.deg) + settings.height;
                ctx.fillText(obj.txt, x + wnap, y);
            });
        },
        __destory : function(){
            $.each(this.options.canvas, function(i, canvas){
                canvas.remove();
                canvas = null;
            });
        }
    }

    $.fn.watermark = function(options){
        new watermark(this).init(options);
    }

})(jQuery);

function getnowDay() {
    var d = new Date();
    var year = d.getFullYear();
    var month = change(d.getMonth() + 1);
    var day = change(d.getDate());
    function change(t) {
        if (t < 10) {
            return "0" + t;
        } else {
            return t;
        }
    }
    var time = year + '年' + month + '月' + day + '日 ';
    return time;
}

function getnowTime() {
    var d = new Date();
    var hour = change(d.getHours());
    var minute = change(d.getMinutes());
    var second = change(d.getSeconds());
    function change(t) {
        if (t < 10) {
            return "0" + t;
        } else {
            return t;
        }
    }
    var time = hour + '时' + minute + '分' + second + '秒';
    return time;
}