固定table的行和列案例

44 篇文章 0 订阅

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 http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>固定table的行和列案例</title>
<script src="http://libs.baidu.com/jquery/1.6.4/jquery.min.js"></script>
<script src="FixTable.js" type="text/javascript"></script>
<style type="text/css">
	.body{
		padding:0px;
		margin:0px;
		font-size:12px;
	}

.common-table{ width:100%; color:#174b73; border-collapse:collapse;border:solid 1px #cdddf6;}
.common-table caption{padding:10px 2px;font-size:14px; text-align:center; background-color:#DFEAF0;color:#486CA3;border:solid 1px #cdddf6;font-weight:bold;border-bottom:none;}
/*.common-table th{padding:5px 2px; text-align:center; background-color:#DFEAFB;color:#486CA3;border:solid 1px #cdddf6;}*/
.common-table th{padding:5px; text-align:center;/* background-color:#DFEAFB;*/border:solid 1px #cdddf6;/*color:#3fade7;*/border-bottom: 1px solid #d0e3f1;
background: #e7f1fa;line-height:20px;}
.common-table td{background-color:#FFF;border:solid 1px #dedede;padding:5px;line-height:20px;}
.common-table tr:hover td {}
.common-table tr.alter-item td {background-color:#f9f9f9; border:solid 1px #dedede; }
.common-table tr.pager-item{border: 1px solid #dedede;border-top:1px solid #018fd9;background:#e7f1fa;}
.common-table tr.pager-item td {background:none;text-align: right;padding: 3px;border:none;}
.common-table tr.pager-item td a {margin-left:5px;}
.common-table a:link,.common-table a:active,.common-table a:visited{text-decoration:underline;}
</style>
<script type="text/javascript">

	var isloadFixtable = false;
	function fixTable() {
		if (isloadFixtable == false) { 
		    //横向和纵向都有滚动条
			$("#fixTable").fixTable({
				fixColumn: 1,//固定列数 
            });
			//重新生成滚动条
            $("#fixTable").fixTable({
                fixColumn: 1,//固定列数 
            });

            //自动求解只有横向
            $("#fixTableH").fixTable({
                fixColumn: 1,//固定列数
                width: 700,//显示宽度
                height: 350//显示高度
            });

            //确定只有横向
            $("#fixTableH2").fixColumn({
                fixColumn: 1,//固定列数
                width: 700,//显示宽度
                height: 350//显示高度
            });
            //自动求解只有纵向
            $("#fixTableZ").fixTable({
                fixColumn: 1,//固定列数
                width:1020,//显示宽度
                height: 350//显示高度
            });
            //确定只有纵向
            $("#fixTableZ2").fixThead({
                width: 1020,//显示宽度
                height: 350//显示高度
            });
            //无滚动条
            $("#fixTableW").fixTable({
                fixColumn: 1,//固定列数
                width: 1000,//显示宽度
                height: 350//显示高度
            });
			isloadFixtable = true;
		}
	}
	window.onload = function () {
		if ($(window).width() > 100) {//在某些场景下获取不到table等页面元素的宽高
			fixTable();
		}
	}
	window.onresize = function () {
		fixTable();
	} 
</script>
</head>

<body>
    <h2>场景1:横向和纵向都有滚动条</h2>
    <div style="width:900px;height:350px;">
        <table id="fixTable" class="common-table" style="width:1000px">
            <thead>
                <tr>
                    <th>Month</th>
                    <th>Savings1</th>
                    <th>Savings2</th>
                    <th>Savings3</th>
                    <th>Savings4</th>
                    <th>Savings5</th>
                    <th>Savings6</th>
                    <th>Savings7</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>January1</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February2</td>
                    <td>$80</td>
                    <td>February换行换行换行换行换行换行换行换行换行换行换行换行换行</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February3</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>                
            </tbody>
        </table>
    </div>

    <h2>场景2:自动求解,只有横向滚动条</h2>
    <div style="width:900px;height:150px;">
        <table id="fixTableH" class="common-table" style="width:1000px">
            <thead>
                <tr>
                    <th>Month</th>
                    <th>Savings1</th>
                    <th>Savings2</th>
                    <th>Savings3</th>
                    <th>Savings4</th>
                    <th>Savings5</th>
                    <th>Savings6</th>
                    <th>Savings7</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>January1</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February2</td>
                    <td>$80</td>
                    <td>February换行换行换行换行换行换行换行换行换行换行换行换行换行</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February3</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
            </tbody>
        </table>
    </div>
    <h2>场景2:确定只有横向滚动条</h2>
    <div style="width:900px;height:150px;">
        <table id="fixTableH2" class="common-table" style="width:1000px">
            <thead>
                <tr>
                    <th>Month</th>
                    <th>Savings1</th>
                    <th>Savings2</th>
                    <th>Savings3</th>
                    <th>Savings4</th>
                    <th>Savings5</th>
                    <th>Savings6</th>
                    <th>Savings7</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>January1</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February2</td>
                    <td>$80</td>
                    <td>February换行换行换行换行换行换行换行换行换行换行换行换行换行</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February3</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
            </tbody>
        </table>
    </div>

    <h2>场景3:自动求解,只有纵向滚动条</h2>
    <div style="width:900px;height:350px;">
        <table id="fixTableZ" class="common-table" style="width:1000px">
            <thead>
                <tr>
                    <th>Month</th>
                    <th>Savings1</th>
                    <th>Savings2</th>
                    <th>Savings3</th>
                    <th>Savings4</th>
                    <th>Savings5</th>
                    <th>Savings6</th>
                    <th>Savings7</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>January1</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February2</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February3</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February4</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>                
            </tbody>
        </table>
    </div>

    <h2>场景3:确定只有纵向滚动条</h2>
    <div style="width:1200px;height:350px;">
        <table id="fixTableZ2" class="common-table" style="width:1000px">
            <thead>
                <tr>
                    <th>Month</th>
                    <th>Savings1</th>
                    <th>Savings2</th>
                    <th>Savings3</th>
                    <th>Savings4</th>
                    <th>Savings5</th>
                    <th>Savings6</th>
                    <th>Savings7</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>January1</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February2</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February3</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February4</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February5</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>                
            </tbody>
        </table>
    </div>
    <h2>场景4:无滚动条</h2>
    <div style="width:900px;height:150px;">
        <table id="fixTableW" class="common-table" style="width:1000px">
            <thead>
                <tr>
                    <th>Month</th>
                    <th>Savings1</th>
                    <th>Savings2</th>
                    <th>Savings3</th>
                    <th>Savings4</th>
                    <th>Savings5</th>
                    <th>Savings6</th>
                    <th>Savings7</th>
                </tr>
            </thead>
            <tbody>
                <tr>
                    <td>January1</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February2</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
                <tr>
                    <td>February3</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>February</td>
                    <td>$80</td>
                    <td>January</td>
                    <td>$100</td>
                </tr>
            </tbody>
        </table>
    </div>
</body>
</html>

FixTable.js文件:


/*==================================================固定table的行和列=====================================================================*/
(function ($) {
    "use strict";
    /*====固定table的行和列=====*/
    $.fn.fixTable = function (options) {
        var defaults = {
            fixColumn: 0,
            width: 0,
            height: 0,
            fixColumnWidth: 0,
            fixTheadHeight: 0
        };
        var opts = $.extend(defaults, options);
        $(this)._fixTable(defaults);
    };
    /*====固定table的行=====*/
    $.fn.fixThead = function (options) {
        var defaults = {
            ixFixHeader: true,
            height: 0,
            fixTheadHeight: 0
        };
        $.extend(defaults, options);
        $(this)._fixTable(defaults);
    };
    /*====固定table的列=====*/
    $.fn.fixColumn = function (options) {
        var defaults = {
            fixColumn: 0,
            fixColumnWidth: 0,
        };
        $.extend(defaults, options);
        $(this)._fixTable(defaults);
    };
    /*====内部使用=====*/
    $.fn._fixTable = function (options) {
        var defaults = {
            isDebug: true,
            ixFixHeader: false,
            fixColumn: 0,
            width: 0,
            height: 0,
            fixColumnWidth: 0,
            fixTheadHeight: 0
        };
        try {
            $.extend(defaults, options);
            var _this = $(this);
            if (_this.size() != 1) { alert("固定行列功能运行错误,执行对象应该是单个table"); return; }
            //如果当前元素已经执行过此方法,则清空还原
            var _top = _this.parent().parent();
            var _topId = _top.attr("id");
            if (!!_topId && _topId && _topId.indexOf("_fixTable") > -1) { 
                _this.parent().nextAll().remove();
                _this.unwrap();
                _this.unwrap();  
            }
            //兼容,移动头信息
            if (_this.children("thead").size() == 0) {
                _this.prepend("<thead></thead>");
                _this.children("tbody").find("th").parent().prependTo(_this.children("thead:eq(0)"));
            }
            if (defaults.isDebug) { console.log('固定table的行和列,ID:' + _this.attr("id")); }
            //如果是用%来布局的,则不需设置值,其值默认取其父元素的宽度
            if (defaults.width == 0) { defaults.width = _this.parent().width(); }
            if (defaults.height == 0) { defaults.height = _this.parent().height(); }
            //如果table宽度和高度都小于设定值,则不需要固定行和列
            if (defaults.width >= _this.width() && defaults.height >= _this.height()) {
                if (defaults.isDebug) { console.log('不需要固定行和列'); }
                return;
            }
            //如果table宽度+滚动条(17px)小于设定宽度,则将其值设置为设定宽度度
            var scroll_x = true;
            if (defaults.width > _this.width() + 18) {
                defaults.width = _this.width() + 18;
                scroll_x = false;
                if (defaults.isDebug) { console.log('不需要横向滚动条'); }
            }
            //如果table高度+滚动条高度(20px)小于设定高度,则将其值设置为设定高度
            var scroll_y = true;
            if (defaults.height > _this.height() + 20) {
                defaults.height = _this.height() + 20;
                scroll_y = false;
                if (defaults.isDebug) { console.log('不需要纵向滚动条'); }
            }
            //不需要固定行和列
            if (scroll_x == false && scroll_y == false) {
                if (defaults.isDebug) { console.log('不需要固定行和列'); }
                return;
            }

            //求解列宽行头高
            if (defaults.fixColumnWidth == 0) {
                var _fixColumnWidth = 10;
                _this.find("thead tr:eq(0)").find("th:lt(" + defaults.fixColumn + ")").each(function () {
                    _fixColumnWidth += $(this).width() + 3;
                });
                //兼容
                if (_fixColumnWidth < 40) { _fixColumnWidth = defaults.fixColumn * 90 + 10; }
                defaults.fixColumnWidth = _fixColumnWidth;
            }
            if (defaults.fixTheadHeight == 0) {
                var _fixTheadHeight = _this.find("thead").height() + 3;
                if (_fixTheadHeight < 35) {
                    var trcount = _this.children("thead").children("tr").size();
                    _fixTheadHeight = trcount * 35 + 3;
                }
                defaults.fixTheadHeight = _fixTheadHeight;
            }
            //定义ID名称
            var _randomCode = new Date().valueOf();
            var _id = _this.attr("id");
            var _idBody = "_fixTableBody" + _randomCode;
            var _idTop = "_fixTableTop" + _randomCode;

            //增加原table外层的div,滚动条的宿主
            _this.wrap(function () {
                return $("<div id='" + _idBody + "' style='overflow:auto;position:relative;z-index:100;width:100%;'></div>");
            });
            $("#" + _idBody).css({ "height": defaults.height });

            //增加最外层的div
            $("#" + _idBody).wrap(function () {
                return $("<div id='" + _idTop + "' style='overflow:hidden;position:relative;'></div>");
            });
            $("#" + _idTop).css({ "width": defaults.width });
            $("#" + _idTop).css({ "height": defaults.height });

            if (defaults.fixFixHeader || scroll_y) {
                var _idHeader = "_fixTableHeader" + _randomCode;
                var _cloneHeader = _this.clone();
                $(_cloneHeader).attr("id", _id + _idHeader);

                $("#" + _idTop).append("<div id='" + _idHeader + "' style='overflow:hidden;position:absolute;width:100%;top:0;z-index:100;'></div>");
                $("#" + _idHeader).css({ "width": defaults.width - 17 });
                $("#" + _idHeader).css({ "height": defaults.fixTheadHeight });
                $("#" + _idHeader).append(_cloneHeader);
                $("#" + _idBody).scroll(function (e) {
                    $("#" + _idHeader).scrollLeft($(this).scrollLeft());
                });
            }

            if (defaults.fixColumn > 0 && scroll_x) {
                var _idColumn = "_fixTableColumn" + _randomCode;
                var _idColumnHeader = "_fixTableColumnHeader" + _randomCode;
                var _idColumnBody = "_fixTableColumnBody" + _randomCode;

                var _columnHeaderClone = _this.clone();
                $(_columnHeaderClone).attr("id", _id + _idColumnHeader);
                var _columnBodyClone = _this.clone();
                $(_columnBodyClone).attr("id", _id + _idColumnBody);

                $("#" + _idTop).append("<div id='" + _idColumn + "' style='overflow:hidden;position:absolute;top:0;left:0;z-index:100;'></div>");
                $("#" + _idColumn).css({
                    "width": defaults.fixColumnWidth,
                    "height": defaults.height - 18
                });

                $("#" + _idColumn).append("<div id='" + _idColumnHeader + "' style='overflow:hidden;position:absolute;z-index:100;'></div>");
                $("#" + _idColumnHeader).css({
                    "width": defaults.fixColumnWidth,
                    "height": defaults.fixTheadHeight
                });
                $("#" + _idColumnHeader).append(_columnHeaderClone);

                $("#" + _idColumn).append("<div id='" + _idColumnBody + "' style='overflow:hidden;position:absolute;top:0;'></div>");
                $("#" + _idColumnBody).css({
                    "width": defaults.fixColumnWidth,
                    "height": defaults.height - 18
                });
                $("#" + _idColumnBody).append(_columnBodyClone);
                $("#" + _idBody).scroll(function (e) {
                    $("#" + _idColumnBody).scrollTop($(this).scrollTop());
                });
            }

        } catch (e) {
            console.log(e);
        }
    }
})(jQuery);

效果:

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值