<tbody>出现滚动条后,同<thead>对不齐的解决方案

需求是需要表格滚动,并且表头不动

<table class='table-style'>
  <thead>
    表头部分
  </thead>
  <tbody>
    表体部分
  </tbody>
</table>


<style>
  .table-style {
    width: 100%;
    border: 1px solid silver; /* 有边框 */
    border-collapse: collapse; /* 不会有多重边框 */
  }
  .table-style tbody {
    display: block;
    height: 600px;     /* 设定一个高度,这样才会出现滚动条 */
    overflow-y: auto;
  }
  .table-style thead, tbody tr {
    display: table;
    width: 100%;
    table-layout: fixed;
  }
</style>

如上处理后,表头和表体能对齐,但如果表体出现滚动条,两者就会对不齐了。尝试了很多方法,最后使用了一种:

第一步,将table和thead分别加上ref(refTable, refTHeader)

第二步,设定四个样式:

.scroll-thead {
  width: calc(100% - 17px); /* 一般滚动条17px宽 */
}
.scroll-table {
  background-color: 表格标题的颜色
}

.no-scroll-thead {
  width: 100%;
}
.no-scroll-table: {
  background-color: #ffffff;   /* 没有滚动条时,表格背景设为白色 */
}

第三步,将tbody内的所有td背景色改为白色.

第四步,编写js,当表体.scrollHeight > 表体.clientHeight时,表明出现了滚动条,则为表头添加scroll-thead样式,同时为表格整体添加scroll-table样式。否则就为表头添加.no-scroll-thead样式,同时为表格整体添加no-scroll-table样式即可。

整体思路:

  1. 判断是否出现了滚动条(表头的scrollHeight > clientHeight)。
  2. 如果有滚动条,则缩短表头的宽度(滚动条一般17px宽,可调整)。同时将表格背景色设置同表头一致,否则缩短的表头留出的空间会显示白色。注意将表体单元格背景设置为白色。
  3. 如果没有滚动条,则将表头宽度调置为100%,同时将表格背景色调整为白色。因为没有滚动条的缘故,没有数据的部分会带有表头的颜色。

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过以下方式实现拖动父级滚动条超出100像素固定表格下所有的第一列td: 1. 首先将所有第一列的单元格设置为固定宽度,并将它们设置为相对定位。 2. 使用 JavaScript 监听父级容器的滚动事件,并根据滚动距离调整所有第一列单元格的左间距。 3. 当滚动距离超过100像素时,将所有第一列单元格的左间距设置为0,使它们固定在表格中。 下面是一些示例代码,可以根据实际情况进行修改: HTML 代码: ```html <div class="table-container"> <table id="my-table"> <thead> <tr> <th class="fixed-column">Header 1</th> <th>Header 2</th> <th>Header 3</th> </tr> </thead> <tbody> <tr> <td class="fixed-column">Fixed</td> <td>Data 1</td> <td>Data 2</td> </tr> <tr> <td class="fixed-column">Fixed</td> <td>Data 3</td> <td>Data 4</td> </tr> </tbody> </table> <table> <thead> <tr> <th>Header 1</th> </tr> </thead> <tbody> <tr> <td class="fixed-column">Fixed</td> </tr> <tr> <td class="fixed-column">Fixed</td> </tr> </tbody> </table> </div> ``` CSS 代码: ```css .table-container { overflow-x: auto; max-width: 100%; } #my-table { border-collapse: collapse; width: 100%; } #my-table th, #my-table td { padding: 10px; text-align: left; border: 1px solid #ccc; } .fixed-column { position: relative; width: 100px; left: 0; z-index: 1; } ``` JavaScript 代码: ```javascript var table = document.getElementById("my-table"); var firstColumn = table.getElementsByClassName("fixed-column"); table.parentElement.addEventListener("scroll", function () { var scrollLeft = this.scrollLeft; for (var i = 0; i < firstColumn.length; i++) { if (scrollLeft > 100) { firstColumn[i].style.left = "0"; } else { firstColumn[i].style.left = scrollLeft + "px"; } } }); ``` 这种方法可以在父容器滚动时固定所有表格下的第一列,但是可能会出现一些问题,例如在固定列时表格宽度可能会变窄,因此您需要根据实际情况进行调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值