最可靠方式是使用<col>配合table-layout: fixed:第一列写<col style="width: 120px">,其余列用<col>留空或设width: auto,且<colgroup>须为<table>直接子元素、位于<thead>前,同时<table>必须声明style="table-layout: fixed; width: 100%"。

直接用 <col> 设置第一列宽度最可靠
想让第一列固定为 120px,其他列自适应?<col> 是语义正确、浏览器兼容性好、且不依赖内容的首选方式。它必须放在 <table> 开头、<thead> 或第一行 <tr> 之前,否则无效。
-
<colgroup>必须包裹所有<col>,且每个<col>按顺序对应一列 - 第一列写
<col style="width: 120px">,第二列可省略或写<col>让其自动分配剩余空间 - 仅设
<col>不生效?大概率漏了table-layout: fixed—— 这是关键开关,必须加在<table>的 CSS 里 - 百分比宽度(如
width: 25%)基于整个<table>宽度计算,不是父容器
table-layout: fixed 不加就等于没设宽度
默认的 table-layout: auto 会让浏览器反复测量每行内容来决定列宽,你写的 width 只当“最大建议值”,实际很容易被长文本(比如无空格 URL)撑开。设成 fixed 后,列宽才真正由 <col> 或首行 <td> 的 width 决定。
- 必须显式声明:
table { table-layout: fixed; width: 100%; }(或具体像素值) -
table-layout: fixed本身不指定宽度,它只是“启用精确控制”的前提 - 如果表格没设总宽(如
width: 100%或width: 600px),fixed布局下未定义宽度的列可能坍缩成极窄 - 注意:一旦用了
fixed,<td>内文字换行行为会变——需配合white-space: nowrap或word-break: break-word控制溢出
用 nth-child(1) 给第一列 <td> 加样式风险高
有人喜欢写 td:nth-child(1) { width: 120px; },看起来简单,但实际容易失效或引发布局错乱。
- 这个选择器只匹配“每行中第一个
<td>”,但如果某行有<th>、colspan或动态插入的单元格,序号就乱了 - 在
table-layout: auto下,该样式可能被内容撑开,完全不起作用 - 即使搭配
table-layout: fixed,它优先级低于<col>,且无法控制表头<th>—— 得额外写th:nth-child(1) - padding 和 border 会增加实际占用宽度(比如
width: 120px+padding: 8px= 实际 136px),而<col>不受内边距影响
别信“第一行 <td> 设 width 就能生效”这种老方法
HTML4 风格的 <td width="120"> 在现代项目里基本不可靠。它只在 table-layout: auto 下作为“初始参考值”,浏览器仍会根据后续行内容重算,尤其遇到合并单元格或响应式场景时,宽度会漂移。
立即学习“前端免费学习笔记(深入)”;
- 该属性已从 HTML5 标准中废弃,W3C 不再推荐使用
- 不同浏览器对它的解析差异大,Chrome 可能忽略,Firefox 可能部分生效
- 若用 CSS 替代(如
td:first-of-type { width: 120px; }),同样面临nth-child的序号错位问题 - 真正需要稳定列宽的报表、后台列表、数据导出页,必须回归
<colgroup>+table-layout: fixed组合
<col> 是否存在、table-layout 是否为 fixed、以及表格是否有明确总宽 —— 这三点缺一不可。任何一处松动,都会导致“设了等于没设”。



















