feigao
/****************************************************************
 
jQuery 插件.
 
功能: 固定表格标题行或列头
 
Version: 1.0
 
调用方法:
$(\'#myTable\').fixTable(
    pRow, //可滚动区域第一行的行号
    pCol, //可滚动区域第一列的列号
    splitColor, //(可选)固定区域与滚动区域的分隔线颜色
);
 
 
****************************************************************/

jQuery.fn.extend({
    fixTable: function (pRow, pCol, splitColor) {
        //滚动条宽度
        var scrW = 16;

        //设置分隔线颜色
        if (!splitColor) {
            splitColor = \'#333\';
        }

        //得到表格本身
        var t = $(this);
        var pid = \'fixbox_\' + t.attr(\'id\');

        t.show();

        //得到表格实际大小
        var tw = t.outerWidth(true);
        var th = t.outerHeight(true);

        //在外部包一个DIV,用来获取允许显示区域大小
        t.wrap("<div id=\'" + pid + "\' ></div>");
        var p = $(\'#\' + pid);
        p.css({
            width: \'100%\',
            height: \'100%\',
            border: \'0px\',
            margin: \'0 0 0 0\',
            padding: \'0 0 0 0\'
        });

        //允许显示区域大小
        t.hide();
        var cw = p.outerWidth(true);
        var ch = p.outerHeight(true);
        t.show();

        //拿到表格的HTML代码
        var thtml = p.html();

        //判断是否需要固定行列头
        if (tw <= cw && th <= ch) {
            return;
        }
        //判断需要固定行/列/行列
        var fixType = 4;    //全固定
        if (tw <= cw - scrW) {    //宽度够, 高度不够
            fixType = 1;    //行固定
            cw = tw + scrW;
        } else if (th <= ch - scrW) {    //高度够, 宽度不够
            fixType = 2;    //列固定
            ch = th + scrW;
        }
        //固定单元格的位置
        var w1 = 0;
        var h1 = 0;

        var post = t.offset();

        var p1, p2, p3, p4;
        if (fixType == 4) {    //行头列头都需固定
            //取出指定行列单元格左上角的位置,单位px
            var pos = t.find(\'tr\').eq(pRow).find(\'td\').eq(pCol).offset();

            w1 = pos.left - post.left;
            h1 = pos.top - post.top;

            var tmp = \'<table style="background: #ECE9D8;" \';
            tmp += \'border="0" cellspacing="0" cellpadding="0">\';
            tmp += \'<tr><td style="border-right: 1px solid \' + splitColor +
                \';border-bottom: 1px solid \' + splitColor + \'">\';
            tmp += \'<div id="\' + pid + \'1"></div></td>\';
            tmp += \'<td style="border-bottom: 1px solid \' + splitColor +
                \';"><div id="\' + pid + \'2"></div></td></tr>\';
            tmp += \'<tr><td valign="top" style="border-right: 1px solid \' +
                splitColor + \';"><div id="\' + pid + \'3"></div></td>\';
            tmp += \'<td><div id="\' + pid + \'4"></div></td></tr>\';
            tmp += \'</table>\';

            p.before(tmp);

            $(\'div[id^=\' + pid + \']\').each(function () {
                $(this).css({
                    background: \'white\',
                    overflow: \'hidden\',
                    margin: \'0 0 0 0\',
                    padding: \'0 0 0 0\',
                    border: \'0\'
                });
            });
            p1 = $(\'#\' + pid + \'1\');
            p2 = $(\'#\' + pid + \'2\');
            p3 = $(\'#\' + pid + \'3\');
            p4 = $(\'#\' + pid + \'4\');

            //左上角方块
            p1.html(thtml).css({ width: w1 - 1, height: h1 - 1 });
            p1.find(\'table:first\').attr(\'id\', undefined);

            //右上方块
            p2.html(thtml).css({ width: cw - w1 - scrW, height: h1 - 1 });
            p2.find(\'table:first\').css({
                position: \'relative\',
                left: -w1
            }).attr(\'id\', undefined);

            //左下方块
            p3.html(thtml).css({ width: w1 - 1, height: ch - h1 - scrW });
            p3.find(\'table:first\').css({
                position: \'relative\',
                top: -h1
            }).attr(\'id\', undefined);

            //主方块
            p4.append(p).css({
                width: cw - w1,
                height: ch - h1,
                overflow: \'auto\'
            });

            t.css({
                position: \'relative\',
                top: -h1,
                left: -w1
            });

            p.css({ width: tw - w1, height: th - h1, overflow: \'hidden\' });

            p4.scroll(function () {
                p2.scrollLeft($(this).scrollLeft());
                p3.scrollTop($(this).scrollTop());
            });
        } else if (fixType == 1) {    //只需固定行头
            var pos = t.find(\'tr\').eq(pRow).find(\'td\').first().offset();
            h1 = pos.top - post.top;

            var tmp = \'<table style="background: #ECE9D8;" \';
            tmp += \'border="0" cellspacing="0" cellpadding="0">\';
            tmp += \'<tr><td style="border-bottom: 1px solid \' + splitColor + \'">\';
            tmp += \'<div id="\' + pid + \'1"></div></td></tr>\';
            tmp += \'<tr><td><div id="\' + pid + \'2"></div></td></tr>\';
            tmp += \'</table>\';

            p.before(tmp);

            $(\'div[id^=\' + pid + \']\').each(function () {
                $(this).css({
                    background: \'white\',
                    overflow: \'hidden\',
                    margin: \'0 0 0 0\',
                    padding: \'0 0 0 0\',
                    border: \'0\'
                });
            });
            p1 = $(\'#\' + pid + \'1\');
            p2 = $(\'#\' + pid + \'2\');
            //上方方块
            p1.html(thtml).css({ width: tw, height: h1 - 1 });
            p1.find(\'table:first\').attr(\'id\', undefined);

            //主方块
            p2.append(p).css({
                width: cw + 1,
                height: ch - h1,
                overflow: \'auto\'
            });

            t.css({
                position: \'relative\',
                top: -h1,
                left: 0
            });

            p.css({ width: tw, height: th - h1, overflow: \'hidden\' });
        } else if (fixType == 2) {    //只需固定列头
            var pos = t.find(\'tr\').first().find(\'td\').eq(pCol).offset();
            w1 = pos.left - post.left;

            var tmp = \'<table style="background: #ECE9D8;" \';
            tmp += \'border="0" cellspacing="0" cellpadding="0">\';
            tmp += \'<tr><td valign="top" style="border-right: 1px solid \' + splitColor + \'">\';
            tmp += \'<div id="\' + pid + \'1"></div></td>\';
            tmp += \'<td><div id="\' + pid + \'2"></div></td></tr>\';
            tmp += \'</table>\';

            p.before(tmp);

            $(\'div[id^=\' + pid + \']\').each(function () {
                $(this).css({
                    background: \'white\',
                    overflow: \'hidden\',
                    margin: \'0 0 0 0\',
                    padding: \'0 0 0 0\',
                    border: \'0\'
                });
            });
            p1 = $(\'#\' + pid + \'1\');
            p2 = $(\'#\' + pid + \'2\');
            //上方方块
            p1.html(thtml).css({ width: w1 - 1, height: th });
            p1.find(\'table:first\').attr(\'id\', undefined);

            //主方块
            p2.append(p).css({
                width: cw - w1,
                height: ch + 1,
                overflow: \'auto\'
            });

            t.css({
                position: \'relative\',
                top: 0,
                left: -w1
            });

            p.css({ width: tw - w1, height: th, overflow: \'hidden\' });
        }
    }
});

转自:http://bbs.csdn.net/topics/330147945

分类:

技术点:

相关文章: