必须为table显式设置width:100%且父容器需有可计算宽度,同时启用table-layout:fixed,否则百分比列宽无效;内容溢出需配合white-space与overflow控制。

table 元素必须显式设 width: 100%
只给 <col> 或 <th> 设百分比,表格本身仍可能收缩为内容最小宽度——这是最常被忽略的一步。浏览器默认按内容撑开表格,<code>width 不写就是 auto,不是“继承父容器”。
必须在 table 上写死:width: 100%(或具体像素值),且该值需有明确参照:父容器(如 <div>)得有可计算的宽度,比如 <code>width: 100%、max-width: 800px 或固定 px 值。
- 错误写法:
<table><col width="30%"></table>—— 表格自身没宽度,百分比无意义 - 正确写法:
<div style="width: 100%"><table style="width: 100%">...</table></div> - 若父容器是 flex 容器,需确认其主轴方向与表格是否同向;否则
width: 100%可能不生效
table-layout: fixed 是列宽可控的前提
不加 table-layout: fixed,浏览器会按 table-layout: auto 计算列宽:遍历所有行内容找最大宽度,导致百分比列宽失效、响应式断裂、拖动调整列宽时跳变。
加上后,列宽只由 <col> 或第一行 <th>/<code><td> 的 <code>width 决定,后续行内容再长也不会撑开列。
- 推荐用
<colgroup></colgroup>+<col>:语义清晰、样式隔离、避免首行<th> 被 JS 操作影响 <li>避免混合单位:<code><col width="200px"> <col width="50%">可能触发回退到auto行为 - IE8+ 支持该属性,但部分旧版 WebView 对
<col width="xx%">解析不准,建议统一用style="width: XX%"写法 - 单行截断:
white-space: nowrap; overflow: hidden; text-overflow: ellipsis;(需display: block或inline-block,<td> 默认是 <code>table-cell,可直接用) - 自动换行:
word-break: break-word;或overflow-wrap: break-word;,同时确保white-space: normal; - 图片/内联元素撑宽:
img { max-width: 100%; height: auto; },否则会破坏列宽基准 - 给
table加box-sizing: border-box;,让width: 100%包含边框和 padding - 用
padding替代部分边框视觉效果,更可控 - 检查是否误用了
margin在<td> 上——表格单元格不支持 <code>margin,它会被忽略 实际项目中,最容易被跳过的其实是父容器宽度和table-layout: fixed的绑定关系。只要其中一环缺失,百分比列宽就会“看起来设了,但不起作用”。调试时优先确认这三点:table有没有width、父容器有没有可计算宽度、table-layout是不是fixed。
内容溢出时,white-space 和 overflow 必须配对使用
table-layout: fixed 下,长文本、URL、未换行英文会直接撑破列宽或溢出容器,仅靠 width 无法约束视觉表现。
常见组合:
边框和盒模型会影响总宽度计算
启用 border-collapse: collapse 后,边框会合并,但边框宽度仍计入表格总宽;若列宽加起来是 100%,加上边框就可能超限,导致横向滚动或列压缩。
解决方案:










