border-collapse: collapse 必须写在 table 元素上才生效,写在 tr、td、th 或 div 上无效;它与 border-spacing 互斥,合并边框按宽度>样式实度>声明顺序优先级胜出。

必须写在 table 元素上,否则完全无效。 这是 90% 的人第一次用 border-collapse 失败的根源——它不是单元格级样式,不响应 td、tr 或 th 上的声明。
为什么 border-collapse: collapse 没反应?
常见错误现象:加了属性但边框还是双线、有白缝、td 看起来被内边距撑开错位。
-
border-collapse只对<table> 元素本身生效,写在 <code><tr> 或外层 <code><div> 上会被浏览器静默忽略 <li>如果 <code>td或th没设border(哪怕只是border: 1px solid #000),合并后可能“看不见边框”,实际是边框宽度为 0 - 某些 UI 框架或 CSS 重置库(如 normalize.css)默认设了
table { border-collapse: separate; },需用更高优先级规则覆盖 - 未声明
!DOCTYPE时,IE/旧版浏览器可能回退到怪异模式,导致行为不可预测 - 想控制单元格间距 → 用
border-collapse: separate+border-spacing: 2px - 想让相邻边框合成单线 → 必须用
border-collapse: collapse,并删掉所有border-spacing声明 -
border-spacing不支持百分比或负值,只接受px、em等绝对/相对长度单位 - 同位置边框(如
th的border-bottom和td的border-top)发生冲突时,取最宽者(2px胜过1px) - 宽度相同时,
solid>dashed>dotted - 宽、样式都相同时,CSS 中后定义的规则胜出(比如
td { border-top: 1px solid red; }在th { border-bottom: 1px solid blue; }之后,则显示红色) -
border: none不参与竞争,会被其他方向的边框覆盖(例如td { border: none; border-top: 1px solid #000; }才有效)
border-collapse: collapse 和 border-spacing 能一起用吗?
不能。这两个属性互斥:border-collapse: collapse 会直接忽略 border-spacing 的值,无论你写没写、写多少。
合并后的边框到底显示哪一条?
不是叠加,也不是平均,而是按明确优先级“胜出”:宽度 > 样式实度 > 声明顺序(非颜色深浅)。
最容易被忽略的一点:启用 border-collapse: collapse 后,table 的总宽度不再等于所有 td 宽度之和加两倍边框 —— 因为内部边框被合并计算,盒模型表现和 separate 模式完全不同。调试时别只盯着 td 的 width,要连同 table 的 border 和 padding 一起看。











