我正在try 创建一个具有粘性页眉和页脚表格,并在卷轴之间创建一个tBody,重要的是,滚动条必须只在tBody上,而不是在页眉或页脚上(这就是设计所要求的).

我try 了以下几种方法:

  1. 我的第一个try 是在桌子周围添加一个包装纸,并在上面放上高度和溢出量.除了滚动条扩展到页眉和页脚之外,这基本上是有效的,这是我不想要的.

  2. 我见过一些人使用display:grid,并在thead、tbody和tr上放置了display:contents,以便th和tds成为网格元素.我稍微修改了一下,以便使用子网格.我让父网格的子网格也与grid-template-columns:subgrid一起网格,这似乎是可行的,除了页脚被溢出的主体向下推.

  3. 我见过一些人说要做display:block人,但我做不到,它只会把整个人推到第一栏.

我知道只使用div和单独的页眉、正文和页脚组件就可以做到这一点,但我更希望它是一个表,因为在语义表中包含表数据似乎更合适(尽管如果这不可能,那么这可能就是可行的方法).

div {
  max-height: 160px;
  overflow: auto;
}

table {
  width: 100%;
}

th, td {
  border: 1px solid black;
}

thead {
  background-color: white;
  position: sticky;
  top: 0;
}

tfoot {
  background-color: white;
  position: sticky;
  bottom: 0;
}
<div>
  <table>
    <thead>
      <tr><th>HEAD</th><th>HEAD</th><th>HEAD</th></tr>
    </thead>
    <tbody>
      <tr><td>1</td><td>2</td><td>3</td></tr>
      <tr><td>1</td><td>2</td><td>3</td></tr>
      <tr><td>1</td><td>2</td><td>3</td></tr>
      <tr><td>1</td><td>2</td><td>3</td></tr>
      <tr><td>1</td><td>2</td><td>3</td></tr>
      <tr><td>1</td><td>2</td><td>3</td></tr>
      <tr><td>1</td><td>2</td><td>3</td></tr>
      <tr><td>1</td><td>2</td><td>3</td></tr>
      <tr><td>1</td><td>2</td><td>3</td></tr>
      <tr><td>1</td><td>2</td><td>3</td></tr>
    </tbody>
    <tfoot>
      <tr><td>FOOT</td><td>FOOT</td><td>FOOT</td></tr>
    </tfoot>
  </table>
</div>

table {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
}
 
th, td {
  border: 1px solid black; 
}
 
thead, tbody, tfoot, tr {
  display: grid;
  grid-template-columns: subgrid;
  grid-column: 1 / 4;
}
 
tbody {
  max-height: 128px;
  overflow: auto;
}
 
tfoot {
  position: sticky;
  bottom: 0;
}
<table>
  <thead>
    <tr><th>HEAD</th><th>HEAD</th><th>HEAD</th></tr>
  </thead>
  <tbody>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
  </tbody>
  <tfoot>
    <tr><td>FOOT</td><td>FOOT</td><td>FOOT</td></tr>
  </tfoot>
</table>

table {
  border-collapse: collapse;
}

th, td {
  border: 1px solid black;
}

tbody {
  display: block;
  max-height: 128px;
  overflow: auto;
  width: 100%;
}
<table>
  <thead>
    <tr><th>HEAD</th><th>HEAD</th><th>HEAD</th></tr>
  </thead>
  <tbody>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
  </tbody>
  <tfoot>
    <tr><td>FOOT</td><td>FOOT</td><td>FOOT</td></tr>
  </tfoot>
</table>

推荐答案

网格的解决方案是一个聪明的解决方案,但不是max-height: 128px,而是grid-template-rows: 1fr fit-content(128px) 1fr:

table {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  grid-template-rows: 1fr fit-content(128px) 1fr;
}
 
th, td {
  border: 1px solid black; 
}
 
thead, tbody, tfoot, tr {
  display: grid;
  grid-template-columns: subgrid;
  grid-column: 1 / 4;
}
 
tbody {
  overflow: auto;
}
 
tfoot {
  position: sticky;
  bottom: 0;
}
<table>
  <thead>
    <tr><th>HEAD</th><th>HEAD</th><th>HEAD</th></tr>
  </thead>
  <tbody>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
    <tr><td>1</td><td>2</td><td>3</td></tr>
  </tbody>
  <tfoot>
    <tr><td>FOOT</td><td>FOOT</td><td>FOOT</td></tr>
  </tfoot>
</table>

Html相关问答推荐

springBoot + Thymeleaf:属性中的UTF-8

值更新时旋转数字动画

使用固定的HTML代码创建两个可向右滚动的行

使用Scrapy Select 最后一个子文本

Flexbox嵌套div溢出

我已经在我的网站上创建了按钮,但我不能让它们正确排列.'

为什么前端框架可以创建自定义属性,而我却被期望在挖掘之前添加数据

带有图标和悬停过渡的CSS按钮

perl hdb 调试器:浏览器以错误的编码显示 UTF-8 源代码

在span中添加

带标签 css 的 div 内的中心图标

如何将背景与之前的内容正确对齐

XPATH Select h2标签和

标签之间或h2标签和 标签之间的td元素,以立即为准

如何动态调整彼此重叠的两个 div 的大小,使它们在增长时保持相同的高度

父背景仅在子元素中可见

当我将鼠标悬停在测试类上时,左侧类的 colored颜色 没有改变

Primeng浮动标签溢出管理

是否可以设置用户在联系表单中输入的文本字体的样式

自定义进度条 Html 和 CSS 布局

我的卡片内容无法在 bootstrap 5 中正确居中