HOWTO · HTML

使 HTML 表格可滚动

使用 CSS 溢出,让长的 HTML 表格在固定高度的容器内滚动。在保留原生表格标记和键盘访问的同时,选择垂直和水平滚动。

本页内容

若要避免较长的 HTML 表格撑长页面,可将语义化表格放入高度受限的容器,并设置 overflow-y: auto。当容器内容超过高度限制时,容器会出现垂直滚动;表格仍保留原有的行列结构。

使用 CSS 让 HTML 表格垂直滚动

这个完整页面使用高度为 200 像素的容器,并在其中放置带有表头和表身的原生表格。表格行数足以让内容高于容器,因此读者可以在表格区域内滚动。

<!doctype html>
<html lang="en">
<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <title>Scrollable table</title>
  <style>
    .table-scroll {
      max-height: 200px;
      overflow-y: auto;
      border: 1px solid #ccc;
    }

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

    th, td {
      padding: 8px;
      border: 1px solid #ddd;
      text-align: left;
    }
  </style>
</head>
<body>
  <div class="table-scroll" role="region" aria-label="Employee directory" tabindex="0">
    <table>
      <thead>
        <tr><th scope="col">Name</th><th scope="col">Age</th><th scope="col">Country</th></tr>
      </thead>
      <tbody>
        <tr><td>John Doe</td><td>30</td><td>USA</td></tr>
        <tr><td>Jane Smith</td><td>25</td><td>Canada</td></tr>
        <tr><td>Sam Wilson</td><td>28</td><td>UK</td></tr>
        <tr><td>Emily Johnson</td><td>35</td><td>Australia</td></tr>
        <tr><td>Michael Brown</td><td>40</td><td>Germany</td></tr>
        <tr><td>Linda Davis</td><td>22</td><td>France</td></tr>
        <tr><td>James Garcia</td><td>29</td><td>Spain</td></tr>
        <tr><td>Patricia Martinez</td><td>31</td><td>Mexico</td></tr>
        <tr><td>Robert Wilson</td><td>38</td><td>Italy</td></tr>
        <tr><td>Jessica Lee</td><td>27</td><td>Netherlands</td></tr>
      </tbody>
    </table>
  </div>
</body>
</html>

max-height 会限制容器的高度,而 overflow-y 决定表格高于容器时如何处理。tabindex="0" 让键盘用户可以聚焦该区域;聚焦后可按方向键检查它是否能滚动。区域标签则为辅助技术提供上下文。保留 <table>、<thead>、<tbody> 和表头单元格,让浏览器和辅助技术能够识别表格中的对应关系。

选择 auto 或 scroll 来处理垂直溢出

当内容需要超出容器时,使用 overflow-y: auto,让滚动条按需出现。若表格行能放进容器,就不必预留滚动条空间。overflow-y: scroll 则会要求提供滚动机制,即使内容目前没有超出;不过,滚动条是否可见取决于操作系统和浏览器。无论选择哪种方式,都应将溢出规则设在容器上,而不是单独设在各行上。要限制垂直高度,必须设置 height 或 max-height;否则容器可以随表格增高,也就不需要在内部垂直滚动。

如需快速复制容器规则,可以运行这个简短的 JavaScript 示例。它会输出上文使用的 CSS 声明;请按可视区域调整高度。

const rule = [
  ".table-scroll {",
  "  max-height: 200px;",
  "  overflow-y: auto;",
  "}"
].join("\n");
console.log(rule);
.table-scroll {
  max-height: 200px;
  overflow-y: auto;
}

保留表格语义并支持键盘操作

表格数据应使用真正的表格元素,而不是换成通用的 CSS Grid 单元格。Grid 适合布局,但一组 div 不会自动像数据表格那样呈现表头与单元格之间的关系。示例将可滚动容器标记为一个区域,并让它进入键盘焦点顺序。请用键盘检查:按 Tab 移到带标签的区域,用方向键滚动,然后继续按 Tab。原生表格标记已经提供表格语义,因此不要再为它添加 ARIA 表格角色。

添加水平滚动和 Bootstrap 样式

如果列宽超出可用空间,可为 .table-scroll 添加 overflow-x: auto;这样容器除了垂直滚动,也可以水平滚动。应让表格宽度足以容纳各列,避免文字被挤得难以阅读。请在实际使用表格的窄视口中查看页面,并确认每一列都能访问。

如果项目已经载入 Bootstrap,可以用 table 和 table-bordered 等类为同一个语义化表格设置样式。这些类只影响呈现方式;滚动行为仍由有高度限制的容器及其 CSS 溢出规则提供。这样可以明确控制滚动行为,同时让表格标记在使用或不使用 Bootstrap 时都保持实用。