客户要求实现对表格数据的头几行或者头几列进行冻结,即滚动时保持这几行/列不动,通过网上查找代码,参考已有的代码的思路,实现了可以任意对行、列进行冻结。
实现原理:
创建多个div,div之间通过css实现层叠,每个div放置当前表格的克隆。例如:需要行冻结时,创建存放冻结行表格的div,通过设置z-index属性和position属性,让冻结行表格在数据表格的上层。同理,需要列冻结时,创建存放冻结列表格的div,并放置在数据表格的上层。如果需要行列都冻结时,则除了创建冻结行、冻结列表格的div,还需要创建左上角的固定行列表格的div,并放置在所有div的最上层。
处理表格的滚动事件,在表格横向或者纵向滚动时,同时让相应的冻结行和冻结列也同步滚动。
处理html的resize事件,同步修改表格的滚动区域宽度和高度
代码如下:
/* * 锁定表头和列 * * 参数定义 * 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属性值,即可实现冻结效果
以上所述就是本文的全部内容了,希望大家能够喜欢。
本文地址:https://www.stayed.cn/item/25244
转载请注明出处。
本站部分内容来源于网络,如侵犯到您的权益,请 联系我