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 則會要求提供捲動機制,即使目前內容放得下也一樣;不過,是否顯示捲動條仍取決於作業系統和瀏覽器。無論選擇哪一種,都應將溢位規則設在容器上,而不是個別列上。必須設定高度或最大高度,才能限制垂直空間;否則容器可能隨表格一起增高,也就不需要在容器內垂直捲動。
若要快速複製容器規則,可以執行下方的 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 移至已標示的區域,以方向鍵捲動,再繼續按 Tab 移動。原生表格標記已提供表格語意,因此不要再加上 ARIA 表格角色。
加入水平捲動與 Bootstrap 樣式
如果欄位寬度超出可用空間,請在 .table-scroll 加上 overflow-x: auto;如此一來,容器除了垂直捲動,也能水平捲動。請讓表格維持足以呈現各欄位的寬度,不要把文字擠得難以閱讀。請在實際使用表格的窄視窗中檢視頁面,確認每個欄位都能移至可視範圍。
如果專案已載入 Bootstrap,可以使用 table 和 table-bordered 等類別為同一個語意表格設定樣式。這些類別會影響呈現方式;提供捲動行為的仍是受限高度的容器及其 CSS 溢位規則。這種做法能明確設定捲動行為,也讓表格標記無論有沒有 Bootstrap 都能保持實用。