zoukankan      html  css  js  c++  java
  • HTML Table元素加水印(超出范围不显示)

    首先说明:有三个文件: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;
    }
  • 相关阅读:
    day29
    day28
    day27
    查询区间内有多少个不同的数(线段树/树状数组)
    树状数组变形:带区间修改的树状数组
    特征提取:PCA主成分分析法和NMF非负矩阵分解法
    Trie树
    Logistic&Softmax回归
    高斯贝叶斯分类器(GNB实战)
    朴素贝叶斯分类器(伯努利贝叶斯+高斯贝叶斯+多项式贝叶斯)
  • 原文地址:https://www.cnblogs.com/tzeyeung/p/13531327.html
Copyright © 2011-2022 走看看