您的位置:

详解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进行改造。需要根据自己的实际需求来选择。希望本文能够对您的学习和工作有所帮助。