
前言
方法一:使用橫向滾動容器 (overflow-x: auto)
第一個也是最簡單直接的響應式表格技巧,就是利用 CSS 的 overflow-x: auto 讓表格可以橫向滾動。這種方式不改變表格的結構,僅僅是在小螢幕時允許使用者左右捲動來查看所有欄位。適用情境是當表格欄位數適中且每個欄位內容不至於太長時——也就是表格略微超出手機寬度,但不是寬到無法接受的程度。透過橫向滾動,使用者仍能查看完整資料,而且實作非常簡單。
實作方式
將表格包在一個具有 overflow-x: auto 的容器中,必要時可再加上 max-width: 100% 確保容器不會超出螢幕寬度。這樣,一旦表格整體寬度超出容器,瀏覽器會自動產生水平卷軸允許捲動。你也可以搭配 white-space: nowrap 防止表格內容自動換行,保持橫向滾動的必要性。以下是簡單的程式碼範例:
<!-- HTML:表格外層包一個容器 -->
<div class="table-container">
<table>
<thead>
<tr>
<th>姓名</th>
<th>電子郵件</th>
<th>電話</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<tr>
<td>張小明</td>
<td>xiao.ming@example.com</td>
<td>0912345678</td>
<td>台北市中正區某某路100號</td>
</tr>
<!-- ...更多資料列... -->
</tbody>
</table>
</div>
/* CSS:使表格容器在寬度不足時出現橫向卷軸 */
.table-container {
max-width: 100%;
overflow-x: auto;
}
/* 可選:讓表格內容不換行,必要時才產生水平捲動 */
.table-container table {
white-space: nowrap;
}
在上述範例中,.table-container 元素限制了表格最大寬度並啟用水平捲動。這表示當螢幕過窄放不下整個表格時,使用者可以透過滑動來查看被藏掉的欄位,而不會直接破版跑版。值得注意的是,我們將表格的內容設為不換行,確保長字串不會直接斷行,而是保持在同一列,讓水平卷軸出現。
優點與缺點
優點: 這種方法實作成本極低,只需要幾行 CSS 就搞定,同時保留了表格的結構和所有欄位資料,使用者可以得到完整資訊。對於需要在手機上比較各欄位數據(例如財務報表)的人而言,橫向滾動是理想的選擇,因為資料仍舊以表格方式對齊,方便比對。
缺點: 它需要使用者手動捲動視圖才能看全內容,在欄位很多的情況下用戶體驗稍差。而且部分使用者可能不知道表格可以橫向滑動——為此,你可以考慮在表格右側加上淡淡的陰影或箭頭圖示,作為仍有內容可捲動的提示。此外,如果某些儲存格內容特別長(例如一串不含空格的文字或很長的URL),即便有水平卷軸也可能讓版面出現過長的滾動距離。對此,可以配合使用 word-break: break-all; 或 word-wrap: break-word; 等 CSS 屬性,讓長字串在小螢幕上適當斷行,減少橫向捲動的需求量。
總的來說,橫向滾動容器法適合作為響應式表格的基礎解法:簡單可靠,不改變用戶熟悉的表格佈局。在你不想大動干戈重塑表格時,優先考慮這個方案。
方法二:卡片式表格布局(將每列資料堆疊顯示)
當表格欄位非常多時,手機螢幕即使能捲動也難以同時呈現所有欄位內容。如果你的使用情境允許使用者逐筆查看資料而非橫向比對,可以考慮將每一列資料轉換為直向排列的卡片式版型。這種方式會在小螢幕上改變表格的呈現結構:每一列資料從橫向的表格列,轉變為縱向排列的區塊,每個儲存格以「標籤:內容」的形式顯示。換句話說,原本同一列中的欄位會被堆疊在一起顯示,就像一張卡片列出該筆資料的所有細節。
適用情境
當使用者主要關注個別資料條目的完整資訊,而不需要在不同列之間做直接比較時,卡片式布局非常有用。例如在人員聯絡名單、訂單清單等情境下,使用者通常逐筆瀏覽每筆資料,這時直向的卡片式版型閱讀體驗更友好。在這種布局下,每筆資料的欄位標籤始終與其值並列呈現,不怕因為螢幕窄而錯位。此外,此方法讓每筆資料彼此分隔開來(通常會有明顯的間距或下邊框),在手機上捲動閱讀時,不會混淆哪幾行屬於同一筆資料。
實作方式
我們可以藉助 CSS 媒體查詢 (media queries) 在小螢幕時覆寫表格的預設樣式,將表格轉換為卡片式顯示。實作步驟如下:
隱藏表頭: 卡片式版型中,每筆資料的欄位名稱會直接出現在該筆資料內,因此全域的表頭欄不再需要顯示。我們可以透過 CSS 隱藏 <thead> 或其中的 <tr> 列。例如將表頭設定為 display: none,或更嚴謹地使用 visibility: collapse 或將其移出螢幕,以兼顧無障礙需求(確保螢幕閱讀器仍能讀出欄位名稱)。在簡單範例中,我們直接把 <th> 隱藏即可。
列轉換為區塊: 將每一個資料列(<tr>)設為 display: block,讓它們不再並排,而是依序垂直排列。為了在不同資料列之間增加辨識度,可以在每個 <tr> 下方加上一點間距或邊框。例如設定 tr { margin-bottom: 1em; border-bottom: 2px solid #ddd; }。
儲存格轉換為區塊並顯示標籤: 將每個儲存格(<td>)也設為 display: block,讓單筆資料內的各個欄位值各佔一行。同時,利用 CSS 的偽元素 ::before 在每個 <td> 顯示其對應的欄位名稱。具體作法是在 HTML 中為 <td> 加入自訂屬性來存放欄位名稱,例如 data-label 或 aria-label。接著在 CSS 裡,透過 td::before { content: attr(data-label) } 讀出這個屬性值,作為該欄位的標籤顯示。在偽元素的樣式上,可以將其設為粗體以區別於內容,並加上諸如冒號、空格等格式讓版面清晰。
<table class="responsive-table">
<thead>
<tr>
<th>姓名</th>
<th>電子郵件</th>
<th>電話</th>
<th>地址</th>
<th>備註</th>
</tr>
</thead>
<tbody>
<tr>
<td data-label="姓名">張小明</td>
<td data-label="電子郵件">xiao.ming@example.com</td>
<td data-label="電話">0912345678</td>
<td data-label="地址">台北市中正區某某路100號</td>
<td data-label="備註">重要客戶</td>
</tr>
<tr>
<td data-label="姓名">李小華</td>
<td data-label="電子郵件">lihua99@example.com</td>
<td data-label="電話">0987654321</td>
<td data-label="地址">高雄市前鎮區某某街50號</td>
<td data-label="備註">新用戶</td>
</tr>
<!-- ...更多資料列... -->
</tbody>
</table>
/* 媒體查詢:當螢幕寬度小於600px時套用卡片式樣式 */
@media (max-width: 600px) {
.responsive-table thead,
.responsive-table tr:nth-child(even) thead {
/* 隱藏表頭 (確保不佔空間) */
display: none;
}
.responsive-table tr {
display: block;
margin-bottom: 1em;
border-bottom: 2px solid #eee;
}
.responsive-table td {
display: block;
/* 讓每個欄位各佔一行,並適當內距 */
padding: 0.5em 0;
text-align: left;
position: relative;
}
.responsive-table td::before {
content: attr(data-label) ":"; /* 顯示欄位名稱及冒號 */
font-weight: bold;
display: inline-block;
width: 5em; /* 假設標籤寬度,以對齊 */
color: #555;
}
}
在這段 CSS 中,我們針對 .responsive-table 定義了當螢幕寬度不超過600px時的一系列規則:
隱藏表格的表頭 <thead>,因為欄位名稱會在每個儲存格內顯示。
設定每個資料列 <tr> 為區塊,並在底部增加間距和細線,將不同列視覺上分開。
將每個 <td> 設為區塊並靠左對齊,使其垂直排列。使用 position: relative 是為了方便偽元素定位。
使用 td::before 偽元素從 data-label 屬性讀出欄位名稱,加上中文頓號或冒號作為標識,並設為粗體。display: inline-block 搭配固定寬度,可以把標籤和內容分成左右兩欄,讓多個欄位看起來整齊。例如我們為偽元素設定了寬度5em,這樣若欄位名稱較短時,後面的內容會在相同起始位置對齊(實際專案中可根據最長的欄位名調整這個寬度)。
執行結果
在手機等窄螢幕上,每筆資料將如下顯示:
姓名:張小明
電子郵件:xiao.ming@example.com
電話:0912345678
地址:台北市中正區某某路100號
備註:重要客戶
上述五項依序列出,之後會有一條底部分隔線,再接下一筆資料的列。同樣地,李小華那筆資料也會以相同格式直列呈現。這樣的卡片式版面在小螢幕上閱讀體驗良好:不需要橫向捲動,使用者可以專注於一筆筆資料,輕鬆地上下滑動瀏覽。
優點與缺點
優點: 卡片式布局極大提升了可讀性,尤其當欄位很多時,每筆資料有自己獨立的區塊,不會因欄位過多而在視覺上擁擠不堪。使用者不必左右捲動,一眼就能看到該筆資料的所有欄位資訊。此外,由於我們在每個值前都顯示了欄位名稱,新進入畫面的資料不需要對照表頭也能理解各數值的意義。這種設計對於窄屏裝置非常貼心。
缺點: 主要是在比較資料方面有所犧牲。因為不同列不再並排呈現,使用者難以將多筆資料的同欄位值直接對照。例如在手機上無法輕鬆比較兩筆紀錄的「電話」是否相同——必須分別查看兩張卡片。另外,實現卡片式布局需要在 HTML 裡為每個儲存格添加額外的屬性(如 data-label),稍增繁瑣;不過這通常是批次加在模板裡,一次性工作。而從維護角度,如果日後欄位名稱變更,就要記得同步更新 data-label/aria-label 值,否則行動版顯示的標籤會不正確。最後,開發者也應注意無障礙性:如果透過 display: none 完全隱藏了表頭,應確保屏幕閱讀器可以透過我們提供的欄位標籤讀出正確資訊。
總的來說,卡片式(逐列堆疊)設計是一種著重單筆內容的響應式表格解法。當比較功能不是主要需求時,它能大幅改善行動端的閱讀體驗。
方法三:隱藏部分欄位以精簡呈現
第三種技巧是在保留表格結構的同時,有選擇地隱藏某些欄位,以減少在小螢幕上的寬度負擔。這種方法經常和媒體查詢搭配使用:根據螢幕寬度,逐步隱藏低優先級的欄位,讓版面在窄螢幕下只顯示關鍵資訊。對於欄位特別多的表格,這是一種務實折衷——在小裝置上顯示最重要的幾欄資料,其餘欄位隱藏避免版面擁擠或水平捲動過長。
適用情境
當表格有許多欄位,但並非每個欄位在行動裝置上都同等重要時,可以採用此策略。舉例來說,一份包含「產品名稱、編號、描述、價格、庫存量、供應商、上架日期」等十幾個欄位的商品清單報表,在手機上可能難以完全呈現。與其強迫使用者橫向捲動查看全部,不如挑選其中三到五個最關鍵的欄位(例如產品名稱、價格、庫存量)顯示,其餘資訊暫時隱藏。如此一來,使用者在手機上瀏覽時重點更突出,也不會被過多資訊淹沒。如果需要看完整資料,再透過其他方式(比如點擊進入詳細頁面)獲取。注意:隱藏欄位法適合用在附屬資訊較多的表格,如果所有欄位都很重要,那就不應隱藏而應考慮其他解法。
實作方式
我們需要對 HTML 中的欄位做些標記,以便在 CSS 中選取要隱藏的欄位。常見的方法有兩種:
利用 CSS 選擇器 nth-child: 如果表格結構固定,比如你知道要隱藏「第4欄和第5欄」,可以直接用 CSS 選擇器選取第 n 個 <td> 或 <th>。例如:td:nth-child(4), th:nth-child(4) { display: none; } 會隱藏第4欄所有儲存格及其表頭。在媒體查詢中使用這樣的選擇器即可對不同螢幕大小隱藏不同欄位。
利用自訂類別(class): 在表格的表頭和相應欄位儲存格上加上表示優先級的類別名稱,然後透過 CSS 控制隱顯。例如,可以在不那麼重要的欄位加上 class="hide-mobile",在 CSS 裡寫入 @media (max-width: 600px) { .hide-mobile { display: none; } }。更進一步,我們可以定義多個等級的優先順序類別,如 .priority-1, .priority-2, ...,然後在不同斷點下隱藏越來越多優先級較低的欄位。
<table class="product-table">
<thead>
<tr>
<th>產品名稱</th>
<th class="hide-mobile">產品編號</th>
<th>價格</th>
<th>庫存</th>
<th class="hide-mobile">供應商</th>
<th class="hide-mobile">上架日期</th>
</tr>
</thead>
<tbody>
<tr>
<td>超級無敵好用手機</td>
<td class="hide-mobile">A12345</td>
<td>$999</td>
<td>50</td>
<td class="hide-mobile">某某貿易公司</td>
<td class="hide-mobile">2025-10-01</td>
</tr>
<!-- ...更多產品列... -->
</tbody>
</table>
/* 在螢幕寬度小於768px (平板/手機) 時隱藏標記為 hide-mobile 的欄位 */
@media (max-width: 768px) {
.product-table .hide-mobile {
display: none;
}
}
在這個例子中,我們給「產品編號、供應商、上架日期」這三個欄位加上了 hide-mobile 類別。CSS 媒體查詢設定當螢幕寬度低於768px時,所有 .hide-mobile 元素不顯示。如此一來,手機用戶只會看到產品名稱、價格和庫存三欄關鍵資訊。而在桌機或較寬螢幕上,表格依然完整顯示所有欄位。
優點與缺點
優點: 隱藏部分欄位能大幅減少視覺雜訊,讓關鍵資訊更聚焦。同時,它保留了表格佈局——也就是說,剩下可見的欄位仍是按照表格式橫向排列,可以互相比較。相較於卡片式布局,使用者在手機上依然能橫向看到多筆資料的同一欄位(只是不再有那些被隱藏的欄位干擾)。對於某些管理後台或數據表格,這種方式能在有限空間內提供較完整的列表概覽。
缺點: 最大的顧慮是資料完整性。被你隱藏的欄位內容,用戶在當下裝置上將完全無從得知。如果那些資訊對使用者的任務有幫助,隱藏它們可能造成困擾。因此在決定隱藏哪些欄位時,需要仔細權衡。例如「產品編號」可能對一般瀏覽者不重要,但對管理員可能很重要——針對不同用戶或情境,也許需要不同的響應式策略。另外,如果隱藏過多欄位,也可能讓使用者感到資訊不足。解決辦法:你可以在UI上提供提示或替代途徑,如在每列資料旁加一個「查看詳細」的連結或按鈕(進入包含完整欄位的詳細頁),或者使用工具提示(tooltip)在使用者點擊時顯示被隱藏的資訊。
綜合來看,隱藏欄位是一種務實且容易實現的響應式設計手段。在資訊架構允許的前提下,善用媒體查詢分段隱藏次要欄位,可以讓你的表格在手機上既保持表格式樣方便比較,又不至於擠得難以閱讀。
增強表格可讀性的其他技巧
除了上述三大核心方法外,還有一些輔助性的 CSS 技巧可以讓響應式表格的體驗更加分。我們在此列出幾項供你參考:
固定表頭 (Sticky Header)
如果表格非常長,需要在手機上上下捲動許多才能瀏覽完整,使用者可能會在滑動過程中忘記目前欄位的意義。為了解決這個問題,可以使用 CSS 的 position: sticky 將表頭欄固定在頂部。只要在 <th> 元素上設定 position: sticky; top: 0; z-index: 1; 並指定背景色,就能實現當使用者往下捲動時,表頭仍停留在視窗頂部不消失的效果。如此無論滾動到哪,都能對照欄位名稱,提高可讀性。需注意確保父容器沒有設定 overflow: hidden 才能使 sticky 生效。
文字換行與單字斷行
正如前面提到的,長單字或URL可能會撐破小螢幕版面。我們可以主動讓文字在較窄的空間內換行。使用 CSS 的 word-break 或 overflow-wrap 屬性能實現這一點。
table {
word-break: break-all;
/* 或者使用較新的屬性: */
/* overflow-wrap: break-word; */
}
這將允許長字串在邊界處斷行,避免超出容器。採用這個技巧時,記得同時檢查英文單字或代碼被拆開時是否仍易懂,必要時可以搭配加大行高或改用縮寫等方式優化呈現。
調整字體與間距
在手機上我們通常希望文字稍微大一點以利閱讀,但在表格這種高資訊密度的介面,又希望能多擠進些內容。這兩者需要取得平衡。一般而言,你可以在小螢幕媒體查詢中略微縮小表格字體大小以及減小儲存格內的左右內距。
@media (max-width: 600px) {
.product-table th, .product-table td {
font-size: 0.9em; /* 縮小至原來的90% */
padding: 4px; /* 減少內距 */
}
}
如此可以在不影響可讀性的前提下,讓表格內容佔據更少空間,使小螢幕下每行容納的資訊量稍增,減少換行或滾動。但切忌字體縮得過小,否則適得其反讓使用者看不清。
使用表格 caption 說明
手機使用者有時可能搞不清楚自己看到的是什麼資料表(尤其當只顯示部分欄位時)。善用 HTML <caption> 元素為表格加上一個標題或說明,可以在小螢幕上提供額外的上下文。例如 <caption>10 月份庫存清單(僅顯示主要欄位)</caption> 讓使用者知道隱藏了哪些資訊或表格的主旨。Caption 會在視覺上呈現在表格上方(可用 CSS 調整樣式),對於理解資料很有幫助。
透過以上技巧的靈活運用,你可以針對自己的專案需求,進一步優化響應式表格的細節體驗。接下來,我們彙整一些開發者在實務上常遇到的問題並給出解答。
常見問題 (FAQ)
.product-table th {
position: sticky;
top: 0;
background: #f8f9fa; /* 加上背景色蓋住下面內容 */
}
上面的樣式會讓 .product-table 的表頭在滾動時固定在頂端。同時我們加上背景色,確保表頭文字在蓋住其他資料列時清晰可見。如果表格所在頁面本身也會整頁滾動,你可能需要將表格包在一個固定高度且可滾動的容器中,或調整 z-index 使其效果符合預期。不過大多數情況下,直接對 <th> 設置 sticky 就能運作(現代瀏覽器皆已支援)。額外提示: 如果你的表格有多行表頭(例如分類標題)、或者需要固定側邊欄(凍結首欄),純 CSS 能力有限,可能需要借助 Javascript 或 CSS 更複雜的布局(如 CSS Grid)來實現。但對於一般單列表頭,CSS Sticky 已是簡單又可靠的方案。
結論
透過以上講解,我們了解了不同情境下響應式表格設計的種種技巧。總結來說,沒有萬靈丹可以一次解決所有表格在手機上的顯示難題,但我們可以靈活運用各種方法:簡單的橫向滾動保留了完整性、卡片式布局強調了單筆資料的易讀、隱藏欄位則在資訊取捨間取得平衡。關鍵在於瞭解你的使用者最需要什麼,以及資料的特性如何。
希望這篇教學能帶給你靈感,在未來的專案中打造出既美觀又實用的響應式表格,讓使用者無論使用桌機還是手機,都能優雅地瀏覽你的數據內容!祝你在前端開發的旅程中乘風破浪,寫出更出色的介面介入這個充滿挑戰的領域。Happy coding!