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

实现原理:

创建多个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 id="reportTable" width="1900" freezeRowNum="2" freezeColumnNum="2" class="report" align="center">  ...  </table>

转载http://aystnd.iteye.com/blog/1872879

js表格实现行、列冻结相关推荐

  1. html表格第一列和最后一列冻结

    html表格第一列和最后一列冻结 阿闰 使用div思路,div溢出滚动, js动态获取宽度, 缺陷,滚动条不是很美观 .zuo{ width: 15%; height: 100%; /* border ...

  2. JS组件系列——Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案

    JS组件系列--Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案 参考文章: (1)JS组件系列--Bootstrap Table 冻结列功能IE浏览器兼容性问题解决方案 (2) ...

  3. 谷歌浏览器网页表格复制一列_如何冻结或隐藏Google表格中的列和行

    谷歌浏览器网页表格复制一列 The greater the number of rows and columns in your Google Sheets spreadsheet, the more ...

  4. Angular8简单方式实现表格固定表头和冻结列

    Angular8简单方式实现表格固定表头和冻结列 html页面: <style> .tableheader {position: relative; top: 0px; z-index: ...

  5. 微信小程序表格列冻结功能的实现

    微信小程序表格列冻结功能的实现 **由于公司项目功能需求:查询日考勤报表,如图,用户需要增加横向滚动功能,重点是冻结年月日这列,就像EXCEL那样. 效果如下: 微信小程序表格列冻结功能的实现.mp4 ...

  6. table表格实现行、列冻结

    客户要求实现对表格数据的头几行或者头几列进行冻结,即滚动时保持这几行/列不动,通过网上查找代码,参考已有的代码的思路,实现了可以任意对行.列进行冻结. 实现原理: 创建多个div,div之间通过css ...

  7. 使用fixed进行表格列冻结之后出现的问题

    使用fixed进行表格列冻结之后出现滚动条遮挡 .el-table__fixed {bottom: 17px !important;height: auto !important; } 解决了遮挡之后 ...

  8. HTML 锁定表格首行首列、拖拽表格列宽

    摘自:http://s.yanghao.org/program/viewdetail.php?i=61717 因为与自己的实际情况有些不同,简单的改造了下...如果有版权问题,请留言... 锁定Tab ...

  9. layui表格添加链接列_Layui表格之多列合并展示

    前言: 当我们在使用Layui的时候,有时表格中的列比较多,展示出来肯定是有问题的,这样就不得不舍弃一些列不展示,不展示是一种解决方案,但是更好的解决方案应该是合并展示. 实现效果: 实现代码参考: ...

  10. java mvc 分页查询条件_java分页条件查询-GridManager.js表格插件+Pageable分页对象+mybatis pagehelper分页插件...

    总览: 一. GridManager.js表格插件 直接上插件API:链接地址 感觉该插件简单好用,插件作者也是有问必答,nice 二. 添加依赖 后端: pom文件添加: 1.7.0.RELEASE ...

最新文章

  1. grpc 传递上下文_grpc 源码笔记 02:ClientConn
  2. ST-3806系列单圈编码器 说明书
  3. 跟我一起考PMP--项目质量管理
  4. Linux文件系统中的inode节点详细介绍
  5. 一个项目有两个pom_实现一个Spring Boot Starter超简单,读 Starter 源码也不在话下...
  6. BASIS--如何删除开发用户的开发Key
  7. 练习五:整数顺序排列
  8. RabbitMQ 延迟队列,消息延迟推送
  9. 【C++进阶】 遵循TDD原则,实现平面向量类(Vec2D)
  10. 杂论架构—架构是一种设计 转。。。
  11. 【数据结构、算法】八大排序算法概述(算法复杂度、稳定性)
  12. 17计算机接收调剂学校,2017年计算机科学与技术学院接收非全日制硕士研究生调剂.PDF...
  13. 背诵华为hcia认证考试题库答案能过吗?华为认证等级是怎样的
  14. 设计模式--创建型模式之抽象工厂模式
  15. (ExcelVBA编程入门范例)
  16. fusioncharts java_FusionCharts在Java中的基本使用(2)
  17. Cubieboard1 引导安装 Debian 系统
  18. 字体反爬-起点网月票榜案例
  19. 计算机病毒狭义和广义的区别,狭义相对论和广义相对论的区别是什么?
  20. 十年风雨,一个普通程序员的成长之路(五) 成长:得到与教训

热门文章

  1. Oracle coherence介绍
  2. Heterogeneous Graph Attention Network翻译
  3. deecamp训练营
  4. 怎么给计算机上锁键盘,想把笔记本电脑的键盘锁住,用外置键盘怎样做?
  5. php直播平台原理,php直播平台源码的直播带货平台有何技巧,别说没告诉你
  6. 使用企业微信做微信消息通知
  7. 如何用jQuery访问后台API,实现真正的前后端分离
  8. iTunes修改备份文件路径
  9. 试验设计与方差分析的基本原理——以单因素试验为例
  10. 单表(sqlserver不支持)、整库,支持本地和远程备份