在使用 Bootstrap 進行網頁開發時,如果想要自己在進行一些樣式微調,就常會遇到一些預期之外的排版問題,像是樣式改不過去、或是效果只出現一半...之類的。比如今天的例子就是,當我們想要固定表格的表頭(thead
)時,表格邊框(border
)卻沒辦法一起固定?這種問題該怎麼解呢?
問題的再現
假設我們直接使用原生 HTML 的 table
標籤,並在 thead
中加上 position: sticky; top: 0;
,這樣的設置是沒有問題的,表頭以及上下邊框都可以在畫面捲動時牢牢地固定在最上方。
<table>
<thead style="position: sticky; top: 0;">
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data 1</td>
<td>Data 2</td>
</tr>
</tbody>
</table>
問題來了,如果這個表格已經套用了 Bootstrap ,會發現他原先預設是沒有提供固定表頭的樣式。所以當我們想要固定表頭的話,就要另外加上可以固定位置、但不是專門設計給表格使用的 sticky-top
屬性。結果,當滾動頁面時,表頭的邊框(border
)沒有跟著被固定住就算了,捲動時還會從原先放邊框的位置看到破了個縫,從下面捲上來的文字直接露出來…真是有夠醜。
<table class="table">
<thead class="sticky-top">
<tr>
<th>Header 1</th>
<th>Header 2</th>
</tr>
</thead>
<tbody>
<tr>
<td>Data 1</td>
<td>Data 2</td>
</tr>
</tbody>
</table>
為什麼會這樣?
會出現這個問題的原因在於,Bootstrap 預設的 CSS 對 .table
這個 class 設定了 border-collapse: collapse;
屬性。所以當我們使用 sticky-top
屬性後再捲動畫面時,邊框就被「折疊」起來、看起來就像被吃掉了… 。
要解決這個問題,我們可以利用 Bootstrap 當中既有的 .table
calss 來修改,把 border-collapse
的屬性蓋過去,改成 separate
,這樣我們在捲動的時候邊框就不會collapse了。接著再把 border-spacing
設成0,這樣邊框之間就不會有縫隙,比較美觀。
.table {
border-collapse: separate;
border-spacing: 0;
}
這樣修改後, thead
的邊框和邊框就可以同步,不會在滾動時出現邊框錯位的情況了。
小結
雖然大部分時候套用 bootstrap 確實是很方便,但有時候當我們要去動他的一些預設樣式時,就會變得不是那麼好改。這時候通常問題是出在樣式套用的優先程度上面,可以先檢查是不是這個樣式是不是被設定在 bootstrap 的 class層級 (比如我們今天所講的例子就是發生在 .table
的class上,所以還不算是太難改)。但如果是直接設在更高層級上面的樣式,那就會比較麻煩了,要注意的地方也會比較多。
所以其實bootstrap不是說不好用,而是要看你對樣式靈活度的需求在哪裡,如果是想要快速的做出美觀好看的頁面,大多數只是想要套用樣式範本的話,確實使用bootstrap會方便又好維護。但如果一開始在設計時,就有很多想要自己修改bootstrap樣式或自創介面的想法的話,建議還是不要直接套 bootatrap,以免反而更費事喔。
codepen範例: https://codepen.io/bonniejhou/pen/yLmPVMM