고객이 테이블 데이터의 처음 몇 행이나 열을 고정해 달라고 요청했습니다. 즉, 온라인에서 코드를 검색하고 기존 코드를 참조하여 이러한 행/열이 움직이지 않게 유지해 달라고 요청했습니다. 테이블 데이터 고정이 실현되었습니다. 행과 열이 고정되었습니다.
구현 원칙:
CSS를 통해 여러 div를 계단식으로 만들고 각 div에 현재 테이블의 복제본을 배치합니다. 예를 들어 행을 고정해야 하는 경우 고정된 행 테이블을 저장할 div를 만들고 고정된 행 테이블이 데이터 테이블 위에 오도록 z-index 속성과 위치 속성을 설정합니다. 마찬가지로 컬럼을 고정해야 할 경우 div를 생성하여 고정 컬럼 테이블을 저장하고 데이터 테이블의 상위 레이어에 배치합니다. 행과 열을 고정해야 하는 경우 고정된 행과 고정된 열 테이블에 대한 div를 생성하는 것 외에도 왼쪽 상단에 고정된 행과 열 테이블에 대한 div를 생성하여 모든 테이블의 최상위 레이어에 배치해야 합니다. div.
테이블의 스크롤 이벤트를 처리합니다. 테이블이 가로 또는 세로로 스크롤되면 해당 고정된 행과 고정된 열도 동시에 스크롤됩니다.
html의 크기 조정 이벤트를 처리하고 테이블 스크롤 영역의 너비와 높이를 동기적으로 수정합니다
코드는 다음과 같습니다.
/* * 锁定表头和列 * * 参数定义 * 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; }); } });
사용 시 테이블 요소에 FreezeRowNum 및 FreezeColumnNum 속성 값을 설정하기만 하면 고정 효과를 얻을 수 있습니다
위 내용은 이 글의 전체 내용입니다. 모두 마음에 드셨으면 좋겠습니다.