表格对齐
分隔行除了声明「这里往下都是数据」,还兼职管一件正事:每一列的对齐方式。冒号写在左边就靠左,写在右边就靠右,两边都有就居中,一个都没有就交给默认样式。规则只有这一处要记——冒号只写在分隔行里,数据行一个都不用管。
| 左对齐 | 居中 | 右对齐 |
| :--- | :---: | ---: |
| A | B | C |
<table>
<thead>
<tr>
<th align="left">左对齐</th>
<th align="center">居中</th>
<th align="right">右对齐</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">A</td>
<td align="center">B</td>
<td align="right">C</td>
</tr>
</tbody>
</table>
冒号直接变成了单元格上的 align 属性,表头和数据行都带着它。
不写冒号就没有对齐属性
| 默认 | 左 | 中 | 右 |
| --- | :-- | :-: | --: |
| A | B | C | D |
<table>
<thead>
<tr>
<th>默认</th>
<th align="left">左</th>
<th align="center">中</th>
<th align="right">右</th>
</tr>
</thead>
<tbody>
<tr>
<td>A</td>
<td align="left">B</td>
<td align="center">C</td>
<td align="right">D</td>
</tr>
</tbody>
</table>
第一列一个 align 属性都没有——没有冒号就没有对齐声明,单元格内容怎么排由主题样式和浏览器默认行为决定。
短横线写几个都一样
分隔行的格子里短横线至少要有一个,写几个不影响对齐:
| 左 | 中 | 右 |
| :- | :-: | -: |
| A | B | C |
<table>
<thead>
<tr>
<th align="left">左</th>
<th align="center">中</th>
<th align="right">右</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">A</td>
<td align="center">B</td>
<td align="right">C</td>
</tr>
</tbody>
</table>
冒号最多只能有一个
这一格写了两个冒号,整行就不再是合法的分隔行,表格直接不成立:
| a |
| ::--- |
| 1 |
<p>| a |
| ::--- |
| 1 |</p>
冒号只写在分隔行,数据行里的冒号是普通字符。 下面的 x: 不会被当成对齐声明,它就是单元格里的一个普通冒号:
| a | b |
| --- | --- |
| x: | y |align 作用在每个单元格上,管的是「这一格里的内容往哪边靠」,不决定列有多宽。列宽由内容和表格布局算法一起算出来:内容越长,列越宽。想让某一列内容对齐,只需要让这一列的内容本身对齐。
还有一点值得知道:align 是 HTML 的表现属性,浏览器把它当成 text-align 来用。只要主题样式没有单独给单元格写 text-align,它就生效;一旦主题写了,CSS 优先,冒号就白写了。这也是同一份 Markdown 在不同站点看起来不一样的原因之一。
哪些列值得指定对齐
金额、版本号、日期这类字符宽度相同的内容,右对齐才有意义——个位、十位对齐之后,读者一眼就能看出两行差多少。状态、名称这类长度参差的文字列,居中比左对齐好看。而说明文字通常保持左对齐:它长短差异大,居中会让行首忽左忽右,反而更难读。
| 写法 | 实际渲染 | 原因 |
|---|---|---|
分隔行写 :--- | 左对齐 | 冒号在左 |
分隔行写 ---: | 右对齐 | 冒号在右 |
分隔行写 :---: | 居中 | 两边都有 |
分隔行写 --- | 无对齐属性 | 没有冒号 |
分隔行写 ::--- | 不是表格 | 冒号最多一个 |
| 数据行里写冒号 | 普通字符 | 冒号只认分隔行 |
把下面这段内容改写成 Markdown 表格:金额列右对齐,状态列居中,说明列左对齐;说明列里有一处要用粗体。
金额 状态 说明
128.00 已完成 订单已结算
9.90 处理中 等待支付回调
解题思路: 对齐方式由分隔行里的冒号决定,冒号写在左边左对齐、右边右对齐、两边都有居中。数据行不用写任何冒号。要注意的是分隔行的格子数必须和表头一致,三列就要写三个格子。
详细步骤:
- 写表头行
| 金额 | 状态 | 说明 |,三列。 - 写分隔行
| ---: | :---: | :--- |:金额列冒号在右,右对齐;状态列两边都有,居中;说明列冒号在左,左对齐。三个格子对应三列。 - 第一条数据行:金额
128.00,状态已完成,说明用**订单已结算**加粗。 - 第二条数据行:金额
9.90,状态处理中,说明等待支付回调保持普通文字。 - 检验:渲染后表格有三列,金额列的数字贴右、状态列居中、说明列贴左,且表头与数据行的对齐一致。
最终答案:
| 金额 | 状态 | 说明 |
| ---: | :---: | :--- |
| 128.00 | 已完成 | **订单已结算** |
| 9.90 | 处理中 | 等待支付回调 |读完这一页,你应当能说出三种对齐各自的写法,能解释为什么不写冒号就没有对齐属性,能说清对齐管的是内容而不是列宽,也能在表格突然不成立时想到「冒号写多了」这个原因。
