Javascript 固定表格表头

遇到一个简单的需求:

客户有一个表格可能有很多内容,当内容很多的时候,表格就会出现滚动条
客户希望当表格内容很多时,只滚动表格而不滚动浏览器窗口
在网上找到很多相关的插件,要不就是太复杂,要不就是满足不了我的要求
于是自己动手写了一个简单的JS方法
思路就是将thead里的tr克隆到tbody里然后将tbody里的首行tr跟thead里的tr大小一致
 
  1. 将thead里的表头tr克隆并插入到tbody里
  2. 将插入到的tbody里的tr内容清除并移除相关属性和大小,仅作为占位使用
  3. 设置tbody大小及滚动
  4. 重新设置thead里的表头大小以保证跟tobdy里的首行tr大小一致
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Document</title>
<style>
	/*自定义行强制显示*/
	#hide_tr{display: table-row!important;}
	/*自定义占位,但不显示大小及内容*/
	#hide_tr *{margin-top: 0;margin-bottom: 0;padding-top: 0;padding-bottom: 0;border-top: 0;border-bottom: 0;height: 0;}
</style>
</head>
<body>
<table id="MyTable" style="width:960px;font-family:微软雅黑;color:#000;font-size:medium;border-color:black" border="1" cellspacing="0" cellpadding="0">
<thead>
	<tr>
		<th>姓名</th>
		<th>语文</th>
		<th>数学</th>
		<th>英语</th>
	</tr>
</thead>
<tbody></tbody>
</table>
</body>
<script src='http://apps.bdimg.com/libs/jquery/1.8.3/jquery.min.js'></script>
<script>
	 /**
	 * @Author:      HTL
	 * @Email:       Huangyuan413026@163.com
	 * @DateTime:    2016-12-26 15:05:55
	 * @Description: 固定表格的表头
	 * 宽度为表格的宽,高度为不含滚动条浏览器的高度
	 */
	function fix_table($obj){
		if(!$obj || $obj.length<=0 || ($('html').height() - $(window).height())<0) return false;
		$obj.show();
		//最大高度为不包含滚动条的高度
		var height = $obj.find('tbody').height() - ($('html').height() - $(window).height()) - 3;
		//设置表格内容高度和宽度
		$obj.find('tbody').css({'max-width': $obj.width(),'overflow':'auto','max-height':height});
		//移出复制的表头并重新添加
		$obj.find("#hide_tr").remove();
		//内容宽度自适应
		$obj.find('thead tr th').css('width','auto');
		// 表头复制并插入到内容
		$obj.find('tbody tr:first').before($obj.find('thead tr').clone());
		var _th = $obj.find('thead th');
		//移出内容的行信息并设置跟表头一样的宽度
		$obj.find('tbody tr:first th').each(function(i,j){ $(this).html('').width($(_th[i]).innerWidth());});
		//表格第一行内容不显示仅占位
		$obj.find('tbody tr:first').attr('id','hide_tr').css('display','table-row');
		//显示滚动条
		$obj.find('tbody,thead tr,tfoot tr').css('display','block');
		//表格内容宽
		_th = $obj.find('tbody th');
		//表头th宽跟内容th宽一致
		$obj.find('thead tr:first th').each(function(i,j){ $(this).width($(_th[i]).width());});
		//页脚th宽跟内容th宽一致
		$obj.find('tfoot tr:first th').each(function(i,j){ $(this).width($(_th[i]).width());});
	}
	$(function(){
		var html = '',tr='<tr><td>学生#index#</td><td>#1#</td><td>#2#</td><td>#3#</td></tr>';
		for(var i=1;i<=100;i++){
			html += tr.replace("#index#",i).replace("#1#",10).replace("#2#",20).replace("#3#",30);
		}
		$("#MyTable tbody").html(html);
		fix_table($("#MyTable"));
	});
</script>
</html>

  





锁定表头固定左边列,原生JS原创代码 需要注意的问题: 1.表格的宽度以及表格每一列的宽度需要固定(特殊情况除外:当表格列数少并且表格总宽度明显小于表格父容器的宽度时,也就是表格列不存在自动换行的问题) 2.表格父容器尺寸大小改变时,需要调用 setBoxSize 方法,目的是判断父容器是否出现滚动条 1.1 修正了对IE6、IE7的兼容问题 1.2 修正了固定行、列的样式问题 1.3 IE6/IE7浏览器 不启用该功能 1.4 增加了拆分线, 修正了重复生成锁定行列的问题以及生成错位的问题, 修正了行、列事件无法复制的问题, 增加了IE6/IE7/IE8 启用设置参数(ieLowVersionEnabled: true|false) ,默认不启用, 注:IE6/7/8锁定表头 由于兼容性问题,有些情况下会有一些错位的问题 1.5 增加了 显示/隐藏功能,修正了非IE浏览器下列宽错位问题 1.6 修正了当有合并单元格时,锁定单元格错位的问题,修正了表格行数较多时的性能问题 1.7 表格单元格可以不指定宽度(锁定时,取实际的单元格宽度),当单元格的左右两边的borderWidth不一样时,会有一些错位 若单元格宽度是固定的,可以在第3个参数(config)中指定 isFixedSize:true 修正表头列未锁定的Bug 1.8 修正表格含有thead时的样式丢失问题,以及行数设置问题,修正thead/tbody行归属问题 1.9 移除tbTopLeft的边框线 修正表格cellpadding/cellspacing的设置问题 修复Firefox下的padding导致的错位问题 修复thead复制没有底部分割线的问题 修复thead复制时无背景色的问题 增加复选框同步功能(如果是JS代码设置复选框选中,需要调用 .setCheckBoxSync()方法) .setCheckBoxSync 方法参数说明:4种参数 1) 复选框控件(html object)数组 2) 复选框控件(html object) 3) 复选框控件ID (string) 4) 空参数(尽量不用空参数)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值