平時要使用 table 的次數說多很少,說少很多,但每次使用一定會被幾個問題「坑」一下,因此這篇博客用來記錄下table那些「小坑」。但 table 也會有不少好用的特性,好比內容自動垂直居中,正是由於這一點,垂直居中能夠用 display: table-cell 和 vertical-align 實現,同時沒有兼容性問題。看來 table 也"還不錯"。ide
1、table自帶特性字體
(一)當 table 寬度設置爲定值時,td 的寬度會自動撐開,按內容長度分配各自寬度(高度同理)。即便給某個 td 設置了必定寬度,其它單元格依舊會自動分配寬度。(這一點跟flex很像)。flex
.container{ width: 500px; height: 120px; } .container table{ width: auto; }
.container{ width: 500px; height: 120px; } .container table{ width: 100%; }
(二)td 內的內容,不論文字、inline元素、仍是block元素都會「垂直居中」。spa
<tr> <td><span>小紅</span></td> <td>女</td> <td><div class="block"></div></td> </tr>
table .block{ display: block; width: 10px; height: 10px; background: green; }
想控制 td 內元素垂直方向上的居中方式,用 vertical-align 屬性。但要注意一點是,vertical-align 是用來設置子元素相對於父元素的居中方式的,因此該屬性要設置在父元素上,即 td 自己。(table 內的 td 默認 vertical-align:middle;)code
table tr th,td{ vertical-align: top; }
(三)th 標籤內的內容會自動垂直水平居中,而且字體加粗。對象
通常 th 是 thead 內的單元格,即表頭信息。blog
(四)table 元素是塊級元素,居中原理與塊級元素相同。ci
不過要注意一點是,用 display:table-cell 方法對其餘元素內的內容實現垂直居中時,元素不能夠被 display:flex 的元素包裹,不然 vertical-align 會失效。博客
(五)table 標籤每出現一次,一個 Table 對象就會被建立,Table對象中封裝了能夠對單元格、行進行直接操縱的API,不用每次都獲取標籤元素了。table
2、table 的邊框問題
table 有個CSS屬性 border-collapse,這個屬性有兩個基本值:separate(默認值)--邊框分離,collapse -- 邊框合一。這兩個屬性稍後會提到,暫且先看看給table 中 的各個元素分別添加 border 是什麼樣。
table{ border: 1px solid black; } table tr{ border: 1px solid red; } table tr th,td{ border: 1px solid green; }
1) 邊框分離 border-collapse: separate; 時
table{ border-collapse: separate; }
直接給 td 加 border,會讓表格看起來有「雙層邊框」,是由於每一個單元格之間有 cellspacing 和 border-spacing。
2) 邊框合一 border-collapse: collapse; 時
table{ border-collapse: collapse; }
很明顯,最後一種就是咱們最須要的那種,可是在「邊框分離」狀態下,也能夠實現相似的效果,就是邊框「粗了點」。如須要,請參照第三種方法。
3) 「邊框分離」模式下模擬的「邊框合一」
table{ border-collapse: separate; border: 1px solid black; border-spacing: 0; /*設置相鄰單元格的邊框間的距離(僅用於「邊框分離」模式)*/
/*empty-cells:hide; /*不在空單元格周圍繪製邊框*/
} table td{ border: 1px solid green; }
這個原理就是讓 td 的邊框與 table 的邊框之間的間距變爲0,兩個 border 挨在一塊兒,看起來像一條 border 罷了。
3、table 的那些坑