jQuery实现冻结表格行和列

   本文给大家分享的是前些日子做的项目中的一个客户的特殊要求,很少遇到,查询了好久的度娘,才算找到解决方案,这里分享给大家,有需要的小伙伴可以参考下。

  客户要求实现对表格数据的头几行或者头几列进行冻结,即滚动时保持这几行/列不动,通过网上查找代码,参考已有的代码的思路,实现了可以任意对行、列进行冻结。

  实现原理:

  创建多个div,div之间通过css实现层叠,每个div放置当前表格的克隆。例如:需要行冻结时,创建存放冻结行表格的div,通过设置z-index属性和position属性,让冻结行表格在数据表格的上层。同理,需要列冻结时,创建存放冻结列表格的div,并放置在数据表格的上层。如果需要行列都冻结时,则除了创建冻结行、冻结列表格的div,还需要创建左上角的固定行列表格的div,并放置在所有div的最上层。

  处理表格的滚动事件,在表格横向或者纵向滚动时,同时让相应的冻结行和冻结列也同步滚动。

  处理html的resize事件,同步修改表格的滚动区域宽度和高度

  代码如下:

  ?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195

/*
* 锁定表头和列
*
* 参数定义
* table - 要锁定的表格元素或者表格ID
* freezeRowNum - 要锁定的前几行行数,如果行不锁定,则设置为0
* freezeColumnNum - 要锁定的前几列列数,如果列不锁定,则设置为0
* width - 表格的滚动区域宽度
* height - 表格的滚动区域高度
*/
function freezeTable(table, freezeRowNum, freezeColumnNum, width, height) {
if (typeof(freezeRowNum) == 'string')
freezeRowNum = parseInt(freezeRowNum)
 
if (typeof(freezeColumnNum) == 'string')
freezeColumnNum = parseInt(freezeColumnNum)
 
var tableId;
if (typeof(table) == 'string') {
tableId = table;
table = $('#' + tableId);
} else
tableId = table.attr('id');
 
var divTableLayout = $("#" + tableId + "_tableLayout");
 
if (divTableLayout.length != 0) {
divTableLayout.before(table);
divTableLayout.empty();
} else {
table.after("<div id='" + tableId + "_tableLayout' style='overflow:hidden;height:" + height + "px; width:" + width + "px;'></div>");
 
divTableLayout = $("#" + tableId + "_tableLayout");
}
 
var html = '';
if (freezeRowNum > 0 && freezeColumnNum > 0)
html += '<div id="' + tableId + '_tableFix" style="padding: 0px;"></div>';
 
if (freezeRowNum > 0)
html += '<div id="' + tableId + '_tableHead" style="padding: 0px;"></div>';
 
if (freezeColumnNum > 0)
html += '<div id="' + tableId + '_tableColumn" style="padding: 0px;"></div>';
 
html += '<div id="' + tableId + '_tableData" style="padding: 0px;"></div>';
 
 
$(html).appendTo("#" + tableId + "_tableLayout");
 
var divTableFix = freezeRowNum > 0 && freezeColumnNum > 0 ? $("#" + tableId + "_tableFix") : null;
var divTableHead = freezeRowNum > 0 ? $("#" + tableId + "_tableHead") : null;
var divTableColumn = freezeColumnNum > 0 ? $("#" + tableId + "_tableColumn") : null;
var divTableData = $("#" + tableId + "_tableData");
 
divTableData.append(table);
 
if (divTableFix != null) {
var tableFixClone = table.clone(true);
tableFixClone.attr("id", tableId + "_tableFixClone");
divTableFix.append(tableFixClone);
}
 
if (divTableHead != null) {
var tableHeadClone = table.clone(true);
tableHeadClone.attr("id", tableId + "_tableHeadClone");
divTableHead.append(tableHeadClone);
}
 
if (divTableColumn != null) {
var tableColumnClone = table.clone(true);
tableColumnClone.attr("id", tableId + "_tableColumnClone");
divTableColumn.append(tableColumnClone);
}
 
$("#" + tableId + "_tableLayout table").css("margin", "0");
 
if (freezeRowNum > 0) {
var HeadHeight = 0;
var ignoreRowNum = 0;
$("#" + tableId + "_tableHead tr:lt(" + freezeRowNum + ")").each(function () {
if (ignoreRowNum > 0)
ignoreRowNum--;
else {
var td = $(this).find('td:first, th:first');
HeadHeight += td.outerHeight(true);
 
ignoreRowNum = td.attr('rowSpan');
if (typeof(ignoreRowNum) == 'undefined')
ignoreRowNum = 0;
else
ignoreRowNum = parseInt(ignoreRowNum) - 1;
}
});
HeadHeight += 2;
 
divTableHead.css("height", HeadHeight);
divTableFix != null && divTableFix.css("height", HeadHeight);
}
 
if (freezeColumnNum > 0) {
var ColumnsWidth = 0;
var ColumnsNumber = 0;
$("#" + tableId + "_tableColumn tr:eq(" + freezeRowNum + ")").find("td:lt(" + freezeColumnNum + "), th:lt(" + freezeColumnNum + ")").each(function () {
if (ColumnsNumber >= freezeColumnNum)
return;
 
ColumnsWidth += $(this).outerWidth(true);
 
ColumnsNumber += $(this).attr('colSpan') ? parseInt($(this).attr('colSpan')) : 1;
});
ColumnsWidth += 2;
 
divTableColumn.css("width", ColumnsWidth);
divTableFix != null && divTableFix.css("width", ColumnsWidth);
}
 
divTableData.scroll(function () {
divTableHead != null && divTableHead.scrollLeft(divTableData.scrollLeft());
 
divTableColumn != null && divTableColumn.scrollTop(divTableData.scrollTop());
});
 
divTableFix != null && divTableFix.css({ "overflow": "hidden", "position": "absolute", "z-index": "50" });
divTableHead != null && divTableHead.css({ "overflow": "hidden", "width": width - 17, "position": "absolute", "z-index": "45" });
divTableColumn != null && divTableColumn.css({ "overflow": "hidden", "height": height - 17, "position": "absolute", "z-index": "40" });
divTableData.css({ "overflow": "scroll", "width": width, "height": height, "position": "absolute" });
 
divTableFix != null && divTableFix.offset(divTableLayout.offset());
divTableHead != null && divTableHead.offset(divTableLayout.offset());
divTableColumn != null && divTableColumn.offset(divTableLayout.offset());
divTableData.offset(divTableLayout.offset());
}
 
/*
* 调整锁定表的宽度和高度,这个函数在resize事件中调用
*
* 参数定义
* table - 要锁定的表格元素或者表格ID
* width - 表格的滚动区域宽度
* height - 表格的滚动区域高度
*/
function adjustTableSize(table, width, height) {
var tableId;
if (typeof(table) == 'string')
tableId = table;
else
tableId = table.attr('id');
 
$("#" + tableId + "_tableLayout").width(width).height(height);
$("#" + tableId + "_tableHead").width(width - 17);
$("#" + tableId + "_tableColumn").height(height - 17);
$("#" + tableId + "_tableData").width(width).height(height);
}
 
function pageHeight() {
if ($.browser.msie) {
return document.compatMode == "CSS1Compat" ? document.documentElement.clientHeight : document.body.clientHeight;
} else {
return self.innerHeight;
}
};
 
//返回当前页面宽度
function pageWidth() {
if ($.browser.msie) {
return document.compatMode == "CSS1Compat" ? document.documentElement.clientWidth : document.body.clientWidth;
} else {
return self.innerWidth;
}
};
 
$(document).ready(function() {
var table = $("table");
var tableId = table.attr('id');
var freezeRowNum = table.attr('freezeRowNum');
var freezeColumnNum = table.attr('freezeColumnNum');
 
if (typeof(freezeRowNum) != 'undefined' || typeof(freezeColumnNum) != 'undefined') {
freezeTable(table, freezeRowNum || 0, freezeColumnNum || 0, pageWidth(), pageHeight());
 
var flag = false;
$(window).resize(function() {
if (flag)
return ;
 
setTimeout(function() {
adjustTableSize(tableId, pageWidth(), pageHeight());
flag = false;
}, 100);
 
flag = true;
});
}
});

  使用时,只要在table元素设置freezeRowNum和freezeColumnNum属性值,即可实现冻结效果

  代码如下:

<table id="reportTable" width="1900" freezeRowNum="2" freezeColumnNum="2" class="report" align="center">
...
</table>

 

  

 

  以上所述就是本文的全部内容了,希望大家能够喜欢。

时间: 2024-10-03 19:01:30

jQuery实现冻结表格行和列的相关文章

【jQuery 冻结任意行列】冻结任意行和列的jQuery插件

    实现原理: 创建多个div,div之间通过css实现层叠,每个div放置当前表格的克隆.例如:需要行冻结时,创建存放冻结行表格的div,通过设置z-index属性和position属性,让冻结行表格在数据表格的上层.同理,需要列冻结时,创建存放冻结列表格的div,并放置在数据表格的上层.如果需要行列都冻结时,则除了创建冻结行.冻结列表格的div,还需要创建左上角的固定行列表格的div,并放置在所有div的最上层. 处理表格的滚动事件,在表格横向或者纵向滚动时,同时让相应的冻结行和冻结列也

jQuery实现表格行和列的动态添加与删除方法【测试可用】_jquery

本文实例讲述了jQuery实现表格行和列的动态添加与删除方法.分享给大家供大家参考,具体如下: 运行效果截图如下: 具体代码如下: <!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/19

jquery获取table指定行和列的数据方法(当前选中行、列)_jquery

实例如下: //不多说,直接上代码. $("table tr").click(function() {//为表格的行添加点击事件 var tr = $(this);//找到tr原色 var td = tr.find("td");//找到td元素 alert(td[0].innerHTML);//指定下标即可 }) 今日项目中需要用到取table选中列的数据,网上资料发现都不能获取到选中指定列的数据,通过分析测试后总结出以上代码,可以获取选中行/列的数据.取td的数据

Excel2010表格行和列怎么转换

  Excel2010表格行和列怎么转换         步骤一.选择需要转换为列的行区域 首先打开相应的工作表,选择需要转为列的行单元格区域,如图所示: 步骤二.复制选中的行内容 切换到"开始"选项卡,在"剪贴板"选项组中单击"复制"按钮,复制选中内容. 步骤三.打开"选择性粘贴"对话框 单击要转换区域的起始单元格并右击,在弹出的快捷菜单中选择"选择性粘贴"命令,如图所示: 步骤四.查看效果 这时我们可以

隐藏Excel表格行和列单元格方法

  方法一:当你选择你下表不要显示的时候,选择那一行,配合SHIFT+CTRL+下方向键,再右击你选择行,点击"隐藏"这就行了. 方法二:直接在输入行里面输入"X:1048576"这里"X"是你需要显示的几行. 通过以上方法就能轻松将Excel表格行和列进行隐藏,不会被其他人进行误操作,不仅可以放心进行编辑,还能保护好自己的隐私安全.如果你想将Excel表格行和列进行隐藏,那就赶紧参照以上步骤进行操作.

如何冻结excel表格行和列?

有时我们的Excel表格的数据行和列都非常多,从而当移到下方查看数据时,表头就看不到了,如果列数较多,一旦向右移动,左边的序号又查看不到,这样非常的不方便,有没有办法把表头及序号固定呢,当然可以,我们可以利用excel冻结窗格功能来实现. excel表格冻结具体方法如下: 方法一.冻结窗格法 将光标定位在要冻结的标题行 ( 可以是一行或多行 ) 的下一行,然后选择菜单栏中的[窗口]→[冻结窗格]" 即可. 这样当上下左右滚屏时,被冻结的标题行或序号总是显示在最上面或最左面,大大增强了表格编辑的直

Word 2007移动表格行和列方法

在编辑表格的过程中,经常需要调用整行(列)到一个新的位置,平常我们习惯性的做法是先插入一个空白行(列),而后再把要移动的行(列)复制到空白行(列).显然这种做法很烦琐.有没有更为简单.实用的方法呢?本人在工作中总结了几种方法,现将其介绍如下: 方法1:首先选中要移动的行(列),把鼠标移动到选中的行(列)上,当指针变成箭头形状时,按下左键不放,上下(左右)拖动鼠标来移动行(列). 方法2:选中要移动的行(列),右击选择"剪切",移动鼠标到其他位置,右击选择"粘贴行"(

Word 2007巧妙移动表格行和列

在编辑表格的过程中,经常需要调用整行(列)到一个新的位置,平常我们习惯性的做法是先插入一个空白行(列),而后再把要移动的行(列)复制到空白行(列).显然这种做法很烦琐.有没有更为简单.实用的方法呢?本人在工作中总结了几种方法,现将其介绍如下: 方法1:首先选中要移动的行(列),把鼠标移动到选中的行(列)上,当指针变成箭头形状时,按下左键不放,上下(左右)拖动鼠标来移动行(列). 方法2:选中要移动的行(列),右击选择"剪切",移动鼠标到其他位置,右击选择"粘贴行"(

wps表格行和列的隐藏

行的隐藏一:   1.首先选中想要隐藏的整行.     2.右击该行,选择"隐藏".    电脑教程 3.可以看到第五行成功被隐藏.     行的隐藏方法二:   1.将光标移至行号的分割线上,通过上下拖动分割线隐藏你想隐藏的行.以下图为例,向上拖动分割线隐藏第九行.     2.第九行成功被隐藏.     列的隐藏一:   1.首先选中想要隐藏的整列.     2.右击该列,选择"隐藏".     3.可以看到B列成功被隐藏了.     列的隐藏二:   1.将光