border-collapse: collapse 必须作用于 table 元素才生效,否则 td/th 边框独立渲染导致双线、错位;启用后需显式设置 td/th 边框,且 border-spacing 失效,边框合并按宽度>样式>声明顺序优先级选取。

border-collapse: collapse 是必须写的,不加它,border 再怎么设都大概率出双线、错位或粗边。
为什么写了 border 还是双线?
浏览器默认用 border-collapse: separate 渲染表格,每个 td 和 th 都有独立边框,再加上默认 border-spacing: 2px,结果就是:相邻单元格的右边框 + 右侧单元格的左边框 = 视觉双线。
- 只给
table设border→ 外框有,内格无,像空心框 - 同时给
table、td、th设border但没border-collapse: collapse→ 边框堆叠,交界处粗得离谱 -
border-collapse: collapse必须写在table上,对td或th写无效
正确设置单线边框的三步写法
目标是每个单元格交界处只有一条清晰边框,且外轮廓完整。关键不是“加多少边框”,而是“合并哪些边框”。
- 在
table上声明border-collapse: collapse - 只给
td和th设border(例如border: 1px solid #ddd),不要给table设内边框(除非你要额外外框) - 若需加粗外边框,单独给
table加border,它会包在已合并的内边框之外,不会干扰网格
推荐写法:
table { border-collapse: collapse; }
td, th { border: 1px solid #ddd; padding: 8px; }
去掉边框时 border: none 为啥经常失效?
模板(如 Bootstrap)或框架常通过高优先级选择器设置 border,仅靠 td { border: none } 会被覆盖。更麻烦的是,有些样式只作用于 th 的 border-bottom,漏掉就留一条线。
- 更稳妥的写法:
table.no-border, table.no-border td, table.no-border th { border: none !important; border-collapse: collapse !important; } - 如果模板用了
border-spacing,还需显式重置:border-spacing: 0 - 注意:
<thead> 或 <code><tbody> 上误加 <code>border,会覆盖th/td的边框,造成局部缺失虚线、圆角等进阶效果要注意什么?
想用
border-style: dashed,同样必须配border-collapse: collapse,否则虚线段在交界处断开、错位。- 要让所有格线都是虚线,必须同时写:
table { border-collapse: collapse; }和th, td { border: 1px dashed #ccc; } - 别省略
border-width,只写border-style: dashed不会显示(浏览器默认medium宽度不可靠) -
border-width影响虚线节奏:1px密、2px稳、3px+易被误读为断点 - 加
border-radius时,记得加overflow: hidden,否则内部边框可能溢出圆角区域
真正难的不是写对一行
border,而是搞清哪一层 CSS 正在偷偷覆盖你写的那条线——尤其是当表头、表格容器、框架类名层层嵌套时。 - 要让所有格线都是虚线,必须同时写:
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











