table-layout: fixed 是移动端自适应表格的起点,需配合 width: 100% 使用,通过第一行 <th> 或 <col> 定义列宽,避免内容撑开;列宽须明确(如 20%、150px);IE8+ 支持但 Outlook 不支持;响应式堆叠需用 data-label + ::before 保留语义,并隐藏 <thead>;滚动方案要防失焦与手势冲突;文字断行需合理组合 word-break、white-space 等属性。
直接写 width: 100% 不管用,是因为浏览器默认用 table-layout: auto —— 它会等所有内容(包括长文本、图片、嵌套元素)加载完再算列宽,小屏下某列被撑开,整行就崩了。
必须显式设 table-layout: fixed,它让浏览器只看第一行 <th> 或 <col> 的宽度声明来分配列宽,渲染快、结果可控。
table-layout: fixed 必须和 width: 100% 同时存在,否则不生效width: 20%、width: 1fr(需配合 display: grid 容器),或在 <col> 标签里写 <col style="width: 150px">
<tr> 变成 block 实现垂直堆叠当列数 ≥ 4,或字段语义强(比如“订单号”“支付时间”“状态”),横向滚动体验差,堆叠才是正解。关键是保留表头语义,不能丢信息。
做法是给每个 <td> 加 data-label,例如:<td data-label="状态">已发货</td>;然后在 CSS 里用 ::before 把 label 插进去。
立即学习“前端免费学习笔记(深入)”;
@media (max-width: 768px) 包裹规则,避免桌面端也被影响<thead> 要 display: none,不然堆叠后表头还占位<tr> 设 display: block,<td> 设 display: block + position: relative,再用 ::before { content: attr(data-label) }
float 或 inline-block,窄屏下换行错位风险高后台数据列表、财务明细这类字段不能删减的场景,滚动是最务实的选择。但原生 <table> 套 overflow-x: auto 容易出问题。
overflow-x: auto,同时加 -webkit-overflow-scrolling: touch(iOS Safari 滚动更顺滑)<input> 或 <select> 容易失焦,补一句 touch-action: manipulation
scrollbar-width: thin 或用 ::-webkit-scrollbar 自定义样式overflow-x: auto 容器,手势识别会混乱,用户一拉就卡住即使布局固定了,长英文、手机号、URL 还是会把列撑爆,尤其在 table-layout: fixed 下更明显。
word-break: break-all 强制断词,适合纯数据表格(如日志、ID 列)word-wrap: break-word(等价于 overflow-wrap: break-word)优先保词意,只在必要时断行,更适合带描述性文本的列white-space: normal 必须显式设置,否则 <td> 默认是 white-space: nowrap,文字绝不换行min-width 或 max-width,记得搭配 box-sizing: border-box,否则 padding/border 会额外加宽data-label 写错大小写导致 ::before 插不出文字,或者忘了关 <thead> 让堆叠后多出空白块。这些地方不跑真机测一次,上线就露馅。