详解table表头固定

一、CSS实现table表头固定

在table标签上加入以下CSS,即可实现table表头固定:

table {
  width: 100%;
  border-collapse: collapse;
  border-spacing: 0;
}

thead,
tfoot {
  width: 100%;
  display: table;
  table-layout: fixed;
}

thead {
  width: calc(100% - 17px);
  overflow-y: scroll;
  height: 50px;
}

thead tr {
  display: table;
  width: 100%;
  table-layout: fixed;
}

thead th {
  position: sticky;
  top: 0;
  background: #fff;
  z-index: 1;
}

以上代码分为三个部分实现:设置table宽度、th固定表头、滚动条悬浮。实现核心是thead、tfoot的设置。

首先,设置table宽度、border等样式;然后,设置thead、tfoot为display: table,可以保证它们的宽度和tbody一致。接着,设置thead的高度为50px,并将overflow-y设置为scroll,这样可以保证thead滚动时固定在顶部;稍后主要是针对thead进行设置。

在thead tr上设置display: table和table-layout: fixed可以保证thead的宽度和tbody的宽度一致和内容显示在一行内。对于thead下的th,则设置为position: sticky,top: 0,可以固定th在顶部,而z-index: 1的设置可以保证其在悬浮效果下不会被覆盖。

二、JavaScript实现table表头固定

使用JavaScript来实现table表头固定,可以自定义更多的功能,如滚动条宽度、表头样式等。

以下是代码实现:

(function() {
  var table = document.querySelector('table');
  var thead = table.querySelector('thead');
  var tr = table.querySelector('tr');
  var cells = tr.children;

  function fixTableHead() {
    var dim = table.getBoundingClientRect();
    var tableLeft = dim.left + window.pageXOffset;
    var tableWidth = dim.width;
    var thOffsets = getTHOffsets(cells);

    if (dim.top < 0) {
      thead.classList.add('fixed');
      thead.style.top = '0';
      thead.style.width = tableWidth + 'px';
      setOffsets(cells, thOffsets);
    } else if (thead.classList.contains('fixed')) {
      thead.classList.remove('fixed');
      setOffsets(cells, null);
    }

    function getTHOffsets(cells) {
      var offsets = [];
      for (var i = 0; i < cells.length; i++) {
        offsets.push(cells[i].getBoundingClientRect().left - tableLeft);
      }
      return offsets;
    }

    function setOffsets(cells, offsets) {
      for (var i = 0; i < cells.length; i++) {
        cells[i].style.width = offsets && offsets[i] ? offsets[i] + 'px' : '';
      }
    }
  }

  window.addEventListener('scroll', fixTableHead);
  window.addEventListener('resize', fixTableHead);
})();

以上代码会对table的表头进行定位,并根据滚动条的位置来判断表头是否需要固定。当表头被固定时,获取每个单元格的offsetLeft,根据offsetLeft来设置单元格的宽度样式,以保证内容与表头的宽度对齐。

三、移动设备中table表头固定

在移动设备中,尺寸较小,为了保证用户能够更好的浏览table,我们需要对table表头进行固定,以下是代码实现:

@media screen and (max-width: 599px) {
  table,
  thead,
  tbody,
  th,
  td,
  tr {
    display: block;
    width: 100%;
  }
  thead tr {
    display:none;
  }
  td {
    border-top: 1px solid #ccc;
  }
  tbody tr {
    margin-bottom: 20px;
  }
  tbody tr:last-child {
    margin-bottom: 0;
  }
  tbody td:before {
    content: attr(data-label);
    font-weight: bold;
    display: inline-block;
    width: 50%;
    margin-left: 15px;
  }
}

以上代码通过媒体查询来对移动设备上的table进行样式设置。通过将table、thead、tbody、th、td、tr设置为display:block和width: 100%等样式,将table中的元素在移动设备中变成垂直排列,且全部占满一行。

因为在移动设备中,table的表头容易被遮挡,所以需要通过将thead tr设置为display:none,来将表头进行隐藏。同时,设置tbody tr和td之间的间距和边框等样式。最后通过before伪元素将每个单元格的内容向左偏移50%,在前面加上表头的label,这样达到表头悬浮内容的效果。

四、结语

以上是对table表头固定的三种实现方式。如果使用CSS或者JavaScript,我们可以自定义样式和功能,而在移动设备上,需要采取特殊的CSS样式来对table进行改造。需要根据自己的实际需求来选择。希望本文能够对您的学习和工作有所帮助。

原创文章,作者:QYWNC,如若转载,请注明出处:https://www.506064.com/n/369376.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
QYWNC的头像QYWNC
上一篇 2025-04-12 13:01
下一篇 2025-04-12 13:01

相关推荐

  • Python合并多个相同表头文件

    对于需要合并多个相同表头文件的情况,我们可以使用Python来实现快速的合并。 一、读取CSV文件 使用Python中的csv库读取CSV文件。 import csv with o…

    编程 2025-04-29
  • Datatables固定表头左右移动无效

    本文旨在解决使用Datatables插件中,固定表头左右移动无效的问题,并提供代码示例以供参考。 一、插件简介 Datatables是一款强悍的jQuery表格插件,支持排序、搜索…

    编程 2025-04-29
  • 使用easypoi创建多个动态表头

    本文将详细介绍如何使用easypoi创建多个动态表头,让表格更加灵活和具有可读性。 一、创建单个动态表头 easypoi是一个基于POI操作Excel的Java框架,支持通过注解的…

    编程 2025-04-28
  • Linux sync详解

    一、sync概述 sync是Linux中一个非常重要的命令,它可以将文件系统缓存中的内容,强制写入磁盘中。在执行sync之前,所有的文件系统更新将不会立即写入磁盘,而是先缓存在内存…

    编程 2025-04-25
  • 神经网络代码详解

    神经网络作为一种人工智能技术,被广泛应用于语音识别、图像识别、自然语言处理等领域。而神经网络的模型编写,离不开代码。本文将从多个方面详细阐述神经网络模型编写的代码技术。 一、神经网…

    编程 2025-04-25
  • Linux修改文件名命令详解

    在Linux系统中,修改文件名是一个很常见的操作。Linux提供了多种方式来修改文件名,这篇文章将介绍Linux修改文件名的详细操作。 一、mv命令 mv命令是Linux下的常用命…

    编程 2025-04-25
  • git config user.name的详解

    一、为什么要使用git config user.name? git是一个非常流行的分布式版本控制系统,很多程序员都会用到它。在使用git commit提交代码时,需要记录commi…

    编程 2025-04-25
  • 详解eclipse设置

    一、安装与基础设置 1、下载eclipse并进行安装。 2、打开eclipse,选择对应的工作空间路径。 File -> Switch Workspace -> [选择…

    编程 2025-04-25
  • C语言贪吃蛇详解

    一、数据结构和算法 C语言贪吃蛇主要运用了以下数据结构和算法: 1. 链表 typedef struct body { int x; int y; struct body *nex…

    编程 2025-04-25
  • Python输入输出详解

    一、文件读写 Python中文件的读写操作是必不可少的基本技能之一。读写文件分别使用open()函数中的’r’和’w’参数,读取文件…

    编程 2025-04-25

发表回复

登录后才能评论