col 元素的 width 属性在现代浏览器中已完全失效,HTML5 规范明确废弃;有效写法是用 style="width: 120px" 或 CSS 类,且必须配合 table-layout: fixed 和明确的 table 宽度。

col 元素的 width 属性在现代浏览器中已完全失效,写 <col width="120"> 不会产生任何视觉效果——这不是兼容性问题,而是 HTML5 规范明确废弃的结果。
为什么 col width="120" 没反应
Chrome、Firefox、Safari 全部静默忽略该属性。DevTools 中能看到标签,但 computed styles 里根本查不到宽度值。它只作为 HTML4 的历史残留存在,不能用于生产环境。
- ✅ 有效写法:
<col style="width: 120px">或<col class="w-120">(配合 CSS.w-120 { width: 120px; }) - ❌ 无效写法:
<col width="120">、<col width="30%">、<colgroup width="100%"> - ⚠️ 注意:
span不广播宽度 ——<col span="3" style="width: 300px">只让第 1 列宽 300px,后两列不受影响
col 必须配合 table-layout: fixed 才能生效
即使写了 style="width: 120px",若没设 table-layout: fixed,列宽依然由内容决定,长文本照样撑开整列。
- 必须在
<table>上显式声明:style="table-layout: fixed; width: 100%"(或具体像素值,如width: 800px) - 百分比宽度(如
width: 30%)是基于<table>自身宽度计算,不是父容器 - 如果
<table>父容器没宽(比如空<div>),width: 100%会退化为 auto,导致所有列宽失控
colgroup 的位置和数量必须严格匹配
<colgroup> 不是“随便放”的容器,结构错一点,整个列宽控制就静默失效。
立即学习“前端免费学习笔记(深入)”;
- 必须是
<table>的**直接子元素**,且顺序固定:<caption>(如有)→<colgroup>→<thead>或第一行<tr> - 错例:
<tbody><colgroup></colgroup></tbody>或<table><tr><colgroup></colgroup></tr></table>—— 浏览器直接丢弃,DevTools 里看不到效果 -
<col>数量必须与表格实际列数完全一致:少一个,最后一列塌缩(Safari 尤其明显);多一个,多余项无作用
拖拽调整列宽时别只改 col 的 width 属性
<col> 是只读快照,不是控制枢纽。拖拽逻辑必须同步更新单元格的 style.width,否则浏览器不重绘。
- 监听
mousedown在<th>右侧伪元素上,读取当前th.style.width或getComputedStyle(th).width -
mousemove时,同时更新当前<th>和同列所有<td>的style.width(不统一设宽会导致错位) - 拖拽结束时,再把新宽度写回对应
<col>的width属性(仅作序列化或服务端回传用) - 避免对
<col>设置style.width—— 它不响应 CSS 样式,设了也无效
最易被忽略的不是怎么写样式,而是 <colgroup> 放错位置、<table> 缺少明确宽度、以及漏掉 table-layout: fixed —— 这三点任一缺失,后面所有设置都白搭。



















